23种设计模式归纳(一)——创建型模式
23种设计模式归纳(二)——结构型模式
行为型设计模式简述
1. 责任链模式
角色:抽象处理者、具体处理者
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用场景:
- a.有多个对象可以处理一个请求,哪个对象该请求运行时刻自动确定。
- b.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- c.可处理一个请求的对象集合应该被动态指定。
2. 命令模式
角色:命令角色、具体命令角色、客户角色、请求者、接收者
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
【小秘密:通过在请求和处理之间加上了一个中间人的角色。通过对中间人角色的特殊设计来形成不同的模式】
3. 解释器模式
角色:抽象表达式角色、终结符表达式角色、非终结符表达式角色、上下文[环境]角色、客户角色
定义:定义语言的文法,并且建立一个解释器解释该语言中的句子。
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
优点:
- 1、可扩展性比较好,灵活。
- 2、增加了新的解释表达式的方式。
- 3、易于实现简单文法。
缺点:
- 1、可利用场景比较少。
- 2、对于复杂的文法比较难维护。
- 3、解释器模式会引起类膨胀。
- 4、解释器模式采用递归调用方法。
使用场景:
- 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
- 2、一些重复出现的问题可以用一种简单的语言来进行表达。
- 3、一个简单语法需要解释的场景。
终结符,通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导。不是终结符的都是非终结符。非终结符可理解为一个可拆分元素,而终结符是不可拆分的最小元素。如:有α → β ,则α 必然是个非终结符。
4. 迭代器模式
角色:抽象迭代器角色,具体迭代器角色、容器角色、具体容器角色
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
5. 中介者模式
角色:抽象调停者、具体调停者、同事角色
定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
典型应用:MVC的service层
6. 备忘录模式
角色:备忘录角色、备忘发起角色、备忘录管理角色
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
【注意:对备忘发起角色应该采用宽接口,对其他的角色或者对象则采用窄接口进行访问】
7. 观察者模式
角色:抽象目标角色、具体目标角色、抽象观察者角色、具体观察者角色
定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
8. 状态模式
角色:使用环境、状态角色、具体状态
定义:允许一个对象在其内部状态改变时改变它的行为。
【适用情况:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态】
9. 策略模式
角色:算法使用环境、抽象策略、具体策略
定义:将算法封装成拥有共同接口的单独的类,并且使他们之间可以互换。
【注意:区分策略和状态模式的关键看行为是由状态驱动还是由一组算法驱动,这条规则似乎有点随意,但是在判断时还是需要考虑它。】
10. 模板方法模式
角色:抽象类、具体类
仅用到了继承关系
11. 访问者模式
定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
角色:访问者角色、具体访问者角色、元素角色、具体元素角色、对象结构角色
使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。