设计模式概述(三)| 青训营笔记

111 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

行为型模式

根据范围进行分类

类行为型模式

使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。

对象行为型模式

使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。

模式

解释器模式

动机

给定一个语言,定义它的文法的一种表示,定义一个解释器,这个解释器使用该表示来解释语言中的句子。用于描述如何使用面向对象语言构造一个简单的语言解释器。解释器模式(Interpreter Pattern) 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码,解释器模式是一种类行为型模式。

适用性

当一个语言需要解释执行,并且可以将语言中句子表示为抽象语法树时,可使用解释器模型。 两个条件:

  • 文法简单。对于复杂的文法,类层次变得庞大,需要使用语法分析程序生成器之类的工具。
  • 效率不是一个关键问题。高效编译器通常不是通过语法树实现的,通常会转换成另一种可高效执行的表示。

示例

基于正则表达式的串匹配问题

State模式

动机

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类 别名:状态对象(Objects for States)

适用性:

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态

示例

网络连接类TCP Connect对象根据自身当前的状态(已建立连接、正在监听、连接已关闭)对请求有不同的反应

Strategy策略模式

动机

定义一系列的算法,把它们一个个封装起来,使得它们可以相互替换,使得算法可独立于客户而变化

  • 别名:政策(Policy)

适用性

  • 许多相关的类仅仅是行为有异,Strategy模式 : 一个类 + 行为类
  • 需要适用一个算法的不同变体,空间、时间权衡
  • 算法使用客户不应该知道的数据,Strategy模式可以避免暴露复杂的、与算法相关的数据结构
  • 一个类定义了多种行为,以多个条件语句的形式实现,而Strategy将相应的条件分支移入各自对应的Strategy类

示例

对正文流进行分析,其中的换行算法

迭代器模式

动机

  • 意图:提供一种方法顺序访问一个聚合对象中各个元素,无需暴露该对象的内部表示
  • 别名:游标Cursor

适用性:

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)

示例

对一个聚合对象,如List,提供遍历访问的方法,同时不暴露其内部结构。通过将List和迭代器分离,还可以提供不同的遍历方式。