《设计模式的艺术》笔记——行为型模式

最近看了刘伟写的《设计模式的艺术》, 第一次具体的学习设计模式,整理了一下笔记。

每种设计模式基本上都只写了定义和结构图,只是写给自己看的,方便回忆使用场景、优缺点等。

职责链模式

  1. 定义:避免将请求发送者与接受者耦合在一起,让多个对象都有机会接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  2. 职责链模式结构图:
  3. 链的形成方式:在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
  4. 能否处理请求交由接收者自己决定。
  5. 职责链的创建工作必须由系统的其他部分来完成。
  6. 纯的职责链模式:要求一个具体处理者要么承担全部责任,要么将责任推给下家。要求一个请求必须被某一个处理者对象所接收。
  7. 不纯的职责链模式:允许某个请求被具体处理者部分处理后再向下传递。且一个请求可以最终不被任何处理者对象所接收。

命令模式

  1. 发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中。
  2. 将请求发送者和接受者完全解耦。
  3. 定义:讲一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
  4. 命令模式结构图:

解释器模式

  1. 文法规则和抽象语法树:
    “1+2+3-4+1”可以用一下文法规则来定义:
1
2
3
expressing ::= value | operation
operation ::= expression '+' expression | expression '-' expression
value ::= an integer
  1. 也可以用抽象语法树的图形方式来直观的表示语言的构成:
  2. 解释器模式描述如何使用面向对象语言构成一个简单的语言解释器。
  3. 定义:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。
  4. 解释器模式结构图:

迭代器模式

  1. 将聚合类中负责遍历数据的方法提取出来,封装到专门的类中。
  2. 定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。
  3. 迭代器模式的结构图:

中介者模式

  1. 定义:用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  2. 中介者模式的结构图:

备忘录模式

  1. 定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
  2. 备忘录模式结构图:
  3. 设计备忘录类时需要考虑其封装性。

观察者模式(发布-订阅模式)

  1. 定义:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
  2. 观察者模式结构图:

状态模式

(很像之前做FPGA时候写的状态机)

  1. 定义:允许一个对象在其内部状态发生改变时改变它的行为,对象看起来似乎修改了它的类。
  2. 状态模式的结构图:
  3. 环境类实际上是真正拥有状态的对象。

策略模式

  1. 主要目的是将算法的定义与使用分开。
  2. 定义:定义一系列算法类,将每一个算法封装起来,并让它们可以互相替换。
  3. 策略模式的结构图:
  4. 具体使用哪个策略类,由客户端决定。

模版方法模式

  1. 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  2. 模版方法模式结构图:
  3. 模版定义基本方法的执行次序。
  4. 钩子方法:使得子类可以控制父类的行为。通常返回一个boolean类型的值。

访问者模式

  1. 以不同的方式操作复杂对象结构。
  2. 定义:提供一个作用于某对象结构中的各元素的操作表示,它使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  3. 访问者模式的结构图:
  4. 可以很方便的地添加新的访问者,但是添加新的元素较为麻烦。