3.1 《硬啃设计模式》第10章 麻烦的日志记录 - 桥模式(Bridge Pattern)

2024-05-23 02:48

本文主要是介绍3.1 《硬啃设计模式》第10章 麻烦的日志记录 - 桥模式(Bridge Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

某日志组件既支持输出到文本文件,也支持输出到数据库文件,它的设计如下:

 桥1.png



很酷的设计,如果哪天要输出到Oracle,增加一个OracleLog类就搞定了!

问:如果要加密信息,咋办呢?
答:那还不容易,在相应的XXLog类中写加密。或者将接口换成抽象类,将加密算法写进去就行了。

问:某些情况下可能需要加密,某些情况可能不需要,加密的算法也可能需要更换,加密最好不要和具体的输出方式绑死。有什么好办法?
答:......

思考:
加密和输出方式两者应该不太相干,用怎样的加密方法不应该影响到用什么输出方式,同样用怎样的输出方式也不应该影响到用什么办法加密。
我们现在要解决的问题是如何让加密、输出方式这两组功能能组合在一起,又不会互相耦合。

如果发现需要将两组功能组合来用时,可以考虑用“桥”将这两组功能组合起来。下面是应用了桥模式之后的设计:

 桥2.png



如果日志想用MD5加密,并保存到Oracle中,则可以写以下代码:
Message m = new MD5_Message(new OracleLog);
m.log("...这里是日志内容...");

如果不想加密,并想输出到TXT文件中,则写如下代码:
Message m = new NoEncryptMessage(new TxtLog);
m.log("..这里是日志内容...");

怎样,简单不?加密与输出方式可以任意组合!我们仔细分析一下设计:
1.该类图的右半部分和之前的是一样的,而多出来的是左半部分。
2.Message抽象类有指向ILog的引用,通过构造函数来传入。
3.每个继承Message的类都需要实现Log()方法,该方法的写法是整个设计精妙的关键之处,要先写加密的代码,然后调用所引用的Log类的Log()方法。
4.加密、输出方式分别被抽象成Message、ILog,这样就将两者分离了可单独发展,而Message还有指向ILog的引用,这是两者的桥梁,桥模式的名字就是这样来的了。

下面看看桥模式的类图:

 桥3.png



这个图稍微比较难懂,很多书籍都会说桥模式是将“抽象”与“实现”分离并可独立扩展,这样的说法我自己也觉得超难理解。
我觉得如果理解不了这样的说法,就不要管“抽象”和“实现”的说法了,就认为将两组功能分离并可以结合使用的一种设计方法,上述的例子还是比较好理解的,按照这样的设计思路,其实可以将Log和Message换过来写,可以是Log引用Message。


 

 

请看下一文……

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

《硬啃设计模式》作者

www.umlonline.org创办人


这篇关于3.1 《硬啃设计模式》第10章 麻烦的日志记录 - 桥模式(Bridge Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996103

相关文章

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素