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

相关文章

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

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各