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

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

数控系统资料记录

数控技术:数控系统刀补功能的软件实现及其仿真--数控仿真程序开发实战 https://github.com/mai4567/CNC 下载编译报错:error: src/dxflib.a: 没有那个文件或目录: 解决:下载dxflibhttps://www.ribbonsoft.com/en/dxflib-downloads,下载完后编译,编译后得到libdxflib.a,替换掉项目makefi

pixel_link记录

export PYTHONPATH=/path2to/pixel_link/pylib/src:$PYTHONPATH   https://blog.csdn.net/northeastsqure/article/details/83655200   https://blog.csdn.net/u011440558/article/details/78606662   报错: All