一、责任链模式(Chain of Responsibility Pattern)
意图:创建一个处理请求的对象链,对象发送者和对象接受者解耦。责任链上的对象如果不能处理请求,就会把请求发送给下一个责任链节点。
实现:
- 创建责任链节点的抽象类
- 使用抽象类生成若干处理节点
- 节点依次连接,保存下一个节点的地址
- 当请求进入时判断是否是自己处理的类型,不是传给下一个节点。
- 请求发送给责任链头节点即可
二、命令模式(Command Pattern)
意图:将请求(可以是调用方法的请求)封装成一个对象,再创建一个执行类,可以向执行类中添加请求对象,然后再统一执行。执行前可以任意添加和删除命令。过程有点类似建造者模式,添加添加然后统一执行。
实现:
- 创建一个命令的接口,声明一个
execute()
执行方法 - 创建一个请求类,里面有若干方法。这个方法原本是直接被调用的,现在要被外面包裹成命令,然后多个命令放到一个执行类中按顺序执行。
- 实现命令接口,每个命令类代表不同的操作。构造方法接收一个请求类,然后在
execute()
方法中对于具体执行操作封装。 - 创建一个命令调用类,类中包含一个列表存储放入的命令类。其中主要包含
- 命令列表(list)
- 添加命令的方法
- 删除命令的方法
- 循环调用命令列表中的命令的执行方法
- 还可以有记录执行了那些命令的方法...(可以根据记录还原)
- 还可以加上
undo()
方法,用于撤销执行的命令。具体实现要结合业务。
- 向命令盗用类中添加若干命令,然后调用执行方法统一执行所以的命令
三、解释器模式(Interpreter Pattern)
意图:将语言或者表达式解析成具体的操作,例如sql
解析,数学公式计算(符号处理引擎)等
实现:
- 创建表达式接口
Expression
,声明一个解析方法interpret
- 创建终结符类(不能再分割的元素)比如
1 + 2
中的1
和2
都是终结符 - 创建非终结符(还能再被分割)
1 + 2
中的+
。+
号左右都可以有元素,在语法树上就是父节点,拥有左右两个子节点。而终结符就是叶子节点。 - 终结符和非终结符都在解析里定义好自己的功能,
如1 + 1
中的终结符就是构造函数接受字符串并转化成int
类型保存。
非终结符+
就是构造函数中接收两个终结符,并调用其解析方法结果相加返回 - 将需要解释的字符串构建成语法树,即非终结符是父节点,终结符是叶子节点的树。然后深度遍历并解析。
四、迭代器模式(Iterator Pattern)
意图: 提供一个方便的遍历集合的方法,但是不用暴露内部结构。
例子: Java中的集合迭代器
实现:
- 创建一个迭代器接口,内部声明
hasNext()
和next()
方法 - 创建一个集合类,内部构件好存储的结构,并实现迭代器接口
- 内部使用一个游标存储当前访问位置,
int index
-
hasNext
方法返回游标是否到了结尾 -
next
方法返回当前游标所在的元素,并且游标下移。
五、中介者模式(Mediator Pattern)
用于降低对象和类之间的通信复杂性。遵循迪米特原则,即最少知道原则。
将原来网状的通信方式转换成星型的结构,所有的类都通过一个中介类进行交流。
实现:
- 创建一个中介类,其中有发送信息的方法
- 创建沟通的类,其中的发送方法使用的就是中介类的方法进行发送
六、备忘录模式(Memento Pattern)
允许获取类的内部状态,并且可以设置状态以便回复到导出时的状态。
在不破坏封装的前提下可以完成类的备份还原,可以用作游戏存档、撤销操作、历史、事务等。
实现:
- 创建状态的类,其中的成员变量就是从需要还原的类中提取出来的变量。
- 创建用于存储和获取状态的类,其中用集合保存状态类。
- 需要还原的类中实现提取状态和通过状态类还原的操作,提取也就是把相应的变量赋值给状态类,还原就是把状态类的信息保存到相应变量。
七、观察者模式(Observer Pattern)
订阅/发布 的模式,发布消息后会通知所有订阅了这个主题topic
的类。
和中介模式的区别是这个是很明显的主体和客体的结构,一个主体发送信息,多个客体接收。
中介模式是所有的类只关心自己和中介类之间的关系,沟通全部交给中介处理。
实现(mqtt的例子):
- 设备连接
mqtt
服务器时维持连接(tcp) - 设备主动订阅主题,服务器根据主题保存相应设备信息(在集合里保存观察者的信息)
- 主题有新的发布后推送给订阅了此主题的设备
八、状态模式(State Pattern)
意图:
允许类的内部在状态发生改变时改变他的行为
代码中有很多改变对象状态的条件语句时,可以使用状态模式将部分条件语句隐藏在类中
把类的可能出现的状态都列举并封装了
缺点:
结构较为复杂
对于开闭原则的支持不是很好,增加状态一定要修改逻辑
类会变庞大
实现:
在类中声明一个状态的属性
进行操作之前判断一下状态,然后再执行相应的动作
九、策略模式(Strategy Pattern)
策略模式就是把操作逻辑封装成不同的类,通过选择不同的类实例化就是选择不同的策略。
这种模式可以减少if...else
的判断次数,逻辑清晰。
算法自由切换,并且拓展性良好
缺点是会增加代码量
spring中可以直接把类注册为组件,然后再通过名字注入。很方便就能实现
实现:
创建策略的接口,内部有具体的操作方法
创建不同的策略实现类,例如+
的策略,就是把传入值相加。-
的策略就是把传入值相减。
实例化策略类,并使用接口操作,执行操作方法。
因为是使用接口操作,所以策略类可以更换成其它的策略也可以正常运行
十、模板模式(Template Pattern)
意图:在抽象类中写好其它几个抽象方法直接的调用关系,具体方法让子类实现。即搭建好累的框架,细节让子类自己实现。
实现:
- 创建一个游戏的抽象类,内部有初始游戏、开始游戏、结束游戏三个抽象方法
- 增加一个
final play
方法,按顺序调用初始、开始、结束三个抽象方法。以指明子类的执行顺序也是这样 - 创建子类,实现此抽象类。实现具体的抽象方法
- 通过父类执行
play
方法
十一、访问者模式(Visitor Pattern)
意图:当一个类的数据结构很稳固,但是操作容易改变。或者类中有很多和结构无关的操作,防止这些操作改变类的数据。所以采用访问者模式进行数据和操作的分离。
有良好的拓展性,符合单一职责原则,灵活
关键:数据类中实现一个接收访问的方法,并调用访问者的访问方法,传入自身
访问者根据传入的数据类进行操作
实现:
- 创建一个被访问接口,内部有一个被访问的方法,入参是访问者接口
- 访问者接口,内部有访问的方法,入参是被访问者接口
- 实现接口
- 访问者需要访问时就直接调用被访问者的被访问方法,并使用入参操作值。
其它设计模式
空对象模式(Null Object Pattern)
意图:用一个代表空的对象代替null
,空对象相对于null
可以拥有默认的行为。
实现:
创建一个对象接口,有isNil
和相应操作的方法
创建一个空对象,并实现isNil
方法,用于判断当前方法是否为空。并赋予默认方法,例如输出当前为空
创建非空对象,实现isNil
方法,并实现操作方法,如输出非空
然后就可以使用了,比如从集合中取出非空元素并执行。
-》 遍历集合,判断是否为空,并执行默认方法