适配器、命令、外观模式

外观模式

外观模式其实大家都不陌生,平时在写代码的时候多多少少都用到过。所谓外观模式,就是将常用的复杂的操作(复杂的接口序列)简化包装,暴露出一个新的接口,是非常自然常用的思想,个人以为几乎都不用将它当成一种模式看待,近似一种本能的行为。程序猿最大的美德不就是懒惰么?

定义

提供了一个统一的接口,用来访问子系统中的一群接口序列,外观定义了一个高层接口,让子系统更容易使用。

实现

可以为原有类添加新的接口,也可以使用新的类实现一系列接口,实现非常灵活。你可以为一个子系统实现一个以上的外观

特点

简化接口
将客户从一个复杂子系统中解耦
注意
我们应尽量遵守最小知识原则,在一个对象的方法内,只应该调用属于以下范围的方法:

对象本身

被当做方法参数传递进来的对象
本身方法创建或实例化的对象
对象的任意组件

适配器模式

适配器模式是为了保持新旧接口之间的兼容性而产生的,我们使用它以使得上层代码全部可以使用新的接口,而不需要改动底层。

定义

将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作。适配器的意图是讲接口转化为不同的接口

给出其结构:

适配器、命令、外观模式

实现

可以有两种方式实现适配器模式:

  • 类继承,通过多重继承原接口类和新接口类
  • 对象实现,采用组合,利用指向原对象的引用调用老接口以实现新接口
应用

举例:对于集合类型,将以前的枚举接口改为新的迭代器接口

命令模式

基本概念

调用者:发出命令的对象,生成命令对象,发出信号以执行
接收者:执行具体操作的对象,解析命令对象
命令对象:描述如何操作的对象,暴露出一个excute接口
命令模式将请求封装成对象,可以让你使用不同的请求、队列,或者日志来参数化其他对象,同时支持撤销操作。

结构图如下:

命令模式结构图
适配器、命令、外观模式

特点

将发出请求的对象和执行请求的对象解耦
在解耦的两者间通过命令对象沟通,封装了接收者的一组动作
支持撤销和宏命令(调用多个命令)
可以使用聪明的命令对象,即直接实现请求而非委托给接收者

应用场景

比如日志和事物系统,举个详细点的例子,比如SNS系统要通过邮件发送各种通知给各位,比如有人评论了,比如你被关注了,那么在被人关注或评论的时候,可以只创建一个命令对象来并把它加入到命令队列,不需要立刻实现发邮件。然后接收者解析命令队列,完成各种数据库操作并生成了邮件内容,它又生成一个新的命令对象来发邮件并把它加到另一台服务器的邮件队列里。另一台服务器到凌晨时发送了邮件。这样一来,客户的动作、数据库的同步、邮件发送都是相互独立的,实现了模块化和解耦。

设计原则

为交互对象的松耦合而努力
最小知识原则:尽量减少依赖