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

相关文章

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio