行为型设计模式总结

文章目录

  • 前言
  • 模板方法模式(Template Method)
  • 策略模式(Strategy)
  • 职责链模式(Chain of Responsibility)
  • 状态模式(State)
  • 命令模式(Command)
  • 观察者模式(Observer)
  • 备忘录模式(Memento)
  • 迭代器模式(Iterator)
  • 解释器模式(Interpreter)
  • 中介者模式(Mediator)
  • 访问者模式(Visitor)
  • 参考资料
  • 总结
  • 作者的话

前言

行为型设计模式总结。


模板方法模式(Template Method)

描述:

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

结构:

  • 抽象类
  • 具体类——与抽象类是继承关系

概述:

  • 抽象类:步骤方法,模板方法
  • 模板方法:定义多个步骤方法的组合内容和执行时序——(算法)模板,不变化行为
  • 具体类:重写抽象类的步骤方法——具体步骤实现,变化行为
  • 客户端:创建抽象类类型的具体类对象,抽象类类型的具体类对象调用抽象类的模板方法

核心:

  • 继承
  • 多态
  • 模板方法:定义多个步骤方法的组合内容和执行时序——(算法)模板,不变化行为
  • 具体类重写抽象类的步骤方法——具体步骤实现,变化行为
  • 算法过程相同,具体步骤实现步骤不同
  • 类比: 房屋建造的步骤和时序固定:先打地基,后建墙壁,打地基的方式,墙壁类型的选择不固定

策略模式(Strategy)

描述:

  • 定义了算法家族,分别封装起来,让它们之间可以互相替换,让算法的变化,不会影响到使用算法的客户

结构:

  • 抽象策略类
  • 具体策略类——与抽象策略类是继承关系
  • 上下文类——与抽象策略类是聚合关系

概述:

  • 抽象策略类:抽象方法
  • 具体策略类:重写抽象策略类的抽象方法为具体方法
  • 上下文类:抽象策略类类型的具体策略类对象字段,设置抽象策略类类型的具体策略类对象为字段方法,方法
  • 设置抽象策略类类型的具体策略类对象为字段方法:设置抽象策略类类型的具体策略类对象为字段
  • 方法:抽象策略类类型的具体策略类对象调用具体策略类的具体方法
  • 客户端:创建具体策略类对象和上下文类对象,上下文类对象调用设置抽象策略类类型的具体策略类对象为字段方法,调用上下文类的方法

策略模式(Strategy)和简单工厂模式(Simple Factory)的区别:

  • 策略模式(Strategy)在客户端创建抽象策略类类型的具体策略类对象和上下文类对象;简单工厂模式(Simple Factory)在客户端简单工厂类的静态方法中判断并创建抽象产品类类型的具体产品类对象
  • 策略模式(Strategy)侧重多样表现的行为;简单工厂模式(Simple Factory)侧重多样实例的创建

策略模式(Strategy)和模板方法模式(Template Method)的区别:

  • 策略模式(Strategy)侧重算法系列相同,类型不同;模板方法模式(Template Method)侧重算法过程相同,具体步骤实现步骤不同

核心:

  • 继承
  • 多态
  • 算法系列相同,类型不同
  • 类比: 陆上交通方式可以选择自行车、公交车或出租车

职责链模式(Chain of Responsibility)

别名:

  • 责任链模式
  • 命令链模式(Chain of Command/CoR)

描述:

  • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

结构:

  • 抽象处理者类
  • 具体处理者类——与抽象处理者是继承关系,与抽象处理者是聚合关系

概述:

  • 抽象处理者类:抽象处理类类型的具体处理类对象字段
  • 抽象处理者类:设置抽象处理类类型的具体处理类对象为字段方法,抽象处理方法
  • 设置抽象处理类类型的具体处理类对象为字段方法:设置抽象处理类类型的具体处理类对象为字段
  • 具体处理者类:重写抽血处理方法为具体处理方法
  • 具体处理方法:处理请求——当前处理者有权处理,或抽象处理类类型的具体处理类对象调用具体处理方法——当前处理者无权处理,交付给下个处理者处理
  • 客户端:创建抽象处理类类型的具体处理类对象,抽象处理类类型的具体处理类对象调用设置抽象处理类类型的具体处理类对象为字段方法——指定下个处理者,抽象处理类类型的具体处理类对象调用具体处理类的具体处理方法

核心:

  • 继承
  • 多态
  • 职责委托和传递
  • 类比: 联系客户服务询问电脑问题,若自动服务的方法无效就转接人工服务

状态模式(State)

描述:

  • 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

结构:

  • 抽象状态类——与上下文类是关联关系
  • 具体状态类——与抽象状态类是继承关系
  • 上下文类——与抽象状态类是聚合关系

概述:

  • 抽象状态类:抽象方法
  • 具体状态类:重写抽象状态类的抽象方法为具体方法
  • 具体方法:参数接收上下文类对象,调用其他具体状态类的构造方法设置抽象状态类类型的具体状态类对象为上下文类对象的字段——新状态
  • 上下文类:抽象状态类类型的具体状态类对象字段——当前状态
  • 上下文类:设置状态方法,处理状态方法
  • 设置状态方法:参数接收抽象状态类类型的具体状态类对象——设置当前状态
  • 处理状态方法:抽象状态类类型的具体状态类对象调用具体状态类的方法:参数发送当前上下文类对象(this)——设置新状态
  • 客户端:创建抽象状态类类型的具体状态类对象——当前状态和上下文类对象,上下文类对象调用设置状态方法——设置当前状态,上下文类对象调用处理状态方法——设置新状态

状态模式(State)与策略模式(Strategy)的区别:

  • 状态模式(State)侧重状态变化,状态互相知道其他存在;策略模式(Strategy)侧重策略选择,策略互相不知道其他存在

核心:

  • 继承
  • 多态
  • 上下文类字段的改变委托给状态类修改
  • 相对复杂的状态转换条件表达式->相对简单的不同状态类
  • 运行时动态修改状态行为
  • 类比: 手机在锁定状态时, 按键解锁,手机在解锁状态时, 按键执行功能

命令模式(Command)

别名:

  • 动作模式(Action)
  • 事务模式(Transaction)

描述:

  • 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

结构:

  • 发送者类——与抽象命令类是聚合关系
  • 抽象命令类
  • 具体命令类——与抽象命令类是继承关系,与接收者类是关联关系
  • 接收者类

概述:

  • 发送者类:抽象命令类类型的具体命令类对象字段
  • 发送者类:设置抽象命令类类型的具体命令类对象为字段方法,命令执行方法
  • 设置抽象命令类类型的具体命令类对象为字段方法:设置抽象命令类类型的具体命令类对象为字段
  • 命令执行方法:抽象命令类类型的具体命令类对象调用具体命令类的具体执行方法
  • 抽象命令类:接收者类对象字段
  • 抽象命令类:设置接收者类对象为字段方法,抽象执行方法
  • 设置接收者类对象方法:设置接收者类对象为字段
  • 具体命令类:重写抽象命令类的抽象执行方法为具体执行方法
  • 具体执行方法:接收者类对象调用接收者类的执行方法
  • 接收者类:执行方法
  • 客户端:创建抽象命令类类型的具体命令类对象,创建接收者类对象,抽象命令类类型的具体命令类对象调用具体命令类的设置接收者类对象为字段方法,创建发送者类对象,发送者类对象调用发送者类的设置抽象命令类类型的具体命令类对象为字段方法,发送者类对象调用命令执行方法

核心:

  • 继承
  • 多态
  • 发送者类委托命令类,命令类委托接收者类
  • 反向创建,正向通知
  • 类比: 顾客点餐到订单,服务员记录订单并通知厨师,厨师依据订单做餐

观察者模式(Observer)

别称:

  • 监听者模式(Listener)
  • 发布-订阅模式(Publish-Subscriber)
  • 事件订阅者模式(Event-Subscriber)

描述:

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

结构:

  • 抽象目标类——与抽象观察者类是关联关系
  • 具体目标类——与抽象目标类是继承关系
  • 抽象观察者类
  • 具体观察者类——与抽象观察者类是继承关系,与具体目标类是关联关系

概述:

  • 抽象目标类:状态字段,状态设置方法,状态获取方法,抽象观察者类类型的具体观察者类对象集合字段,抽象观察者类类型的具体观察者类对象增加方法,抽象观察者类类型的具体观察者类对象减少方法,通知方法
  • 状态设置方法:设置状态字段
  • 状态获取方法:获取状态字段
  • 抽象观察者类类型的具体观察者类对象增加方法:增加抽象观察者类类型的具体观察者类对象到集合字段
  • 抽象观察者类类型的具体观察者类对象减少方法:减少抽象观察者类类型的具体观察者类对象到集合字段
  • 通知方法:遍历抽象观察者类类型的具体观察者类对象集合字段,抽象观察者类类型的具体观察者类对象调用具体观察者类的更新方法(发送通知)
  • 具体目标类可重写抽象目标类的方法
  • 抽象观察者类:更新方法
  • 具体观察者类:抽象目标类类型的具体目标类对象字段,设置状态抽象目标类类型的具体目标类对象字段为字段方法,重写抽象观察者类的更新方法为具体观察者类的具体更新方法
  • 设置状态抽象目标类类型的具体目标类对象字段为字段方法:设置状态抽象目标类类型的具体目标类对象字段为字段
  • 具体更新方法:抽象目标类类型的具体目标类对象调用具体目标类的状态获取方法(接收通知并自动更新)
  • 客户端:创建抽象观察者类类型的具体观察者类对象和具体目标类对象,具体目标类对象调用抽象观察者类类型的具体观察者类对象增加方法,具体目标类对象调用状态设置方法(状态改变),具体目标类对象调用通知方法(目标通知观察者更新过程)

核心:

  • 继承
  • 多态
  • 一个目标类发送通知,多个观察者类接收通知并自动更新
  • 类比: 客户订阅报纸,出版社发布新一期报纸时通知客户

备忘录模式(Memento)

别名:

  • 快照模式(Snapshot)

描述:

  • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

结构:

  • 发起者类——与备忘录类是依赖关系
  • 备忘录类
  • 管理者类——与备忘录类是聚合关系

概述:

  • 发起者:状态字段
  • 发起者:设置状态方法,获取状态方法,创建备忘录方法,恢复备忘录方法
  • 设置状态方法:设置状态字段
  • 获取状态方法:返回状态字段
  • 创建备忘录方法:参数发送发起者类对象的状态字段,创建备忘录类对象——保存记录
  • 恢复备忘录方法:参数接收备忘录类对象,调用备忘录类对象的状态获取方法,设置发起者类对象的状态字段为备忘录类对象的状态字段——恢复记录
  • 备忘录类:状态字段
  • 备忘录类:设置状态方法,获取状态方法
  • 设置状态方法:参数接收发起者类对象的状态字段,设置备忘录类对象的状态字段为发起者类对象的状态字段——保存记录
  • 获取状态方法:返回备忘录类对象的状态字段——恢复记录
  • 管理者类:备忘录类对象字段
  • 管理者类:设置备忘录类对象方法,获取备忘录类对象方法
  • 设置备忘录类对象方法:设置备忘录类对象字段——保存记录
  • 获取备忘录类对象方法:返回备忘录类对象字段——恢复记录
  • 客户端:创建发起者类对象,发起者类对象调用设置状态方法,发起者类对象调用创建备忘录方法——保存记录,创建管理者类对象,管理者类对象调用设置备忘录类对象方法——保存记录,发起者类对象调用设置状态方法——状态改变,管理者类对象调用获取备忘录对象方法——恢复记录,发起者类对象调用恢复备忘录方法——恢复记录

类型:

  • 基于嵌套类的实现:支持嵌套类的编程语言,如C++、 C#和Java
  • 基于接口的实现:不支持嵌套类的编程语言,如PHP

核心:

  • 客户端发起者类对象A调用创建备忘录方法->创建备忘录类对象B记录状态->B保存在管理者类对象C——保存记录
  • A调用恢复备忘录方法->从C获取B恢复状态——恢复记录
  • 类比: 游戏进度的保存和恢复

迭代器模式(Iterator)

描述:

  • 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示

结构:

  • 抽象迭代器类
  • 具体迭代器类——与抽象迭代器类是继承关系,与具体集合类是关联关系
  • 抽象集合类
  • 具体集合类——与抽象集合类是继承关系,与具体迭代器类是关联关系

概述:

  • 抽象迭代器类:抽象获取起始对象方法,抽象获取下个对象方法
  • 具体迭代器类:具体集合类对象字段,迭代位置字段
  • 具体迭代器类:设置具体集合类对象方法,重写抽象获取起始对象方法为具体获取起始对象方法,重写抽象获取下个对象方法为具体获取下个对象方法
  • 设置具体集合类对象方法:设置具体集合类对象为字段
  • 具体获取起始对象方法:返回具体集合类对象中的起始对象
  • 具体获取下个对象方法:依据迭代位置字段返回具体集合类对象中的下个对象
  • 抽象集合类:抽象创建迭代器方法
  • 具体集合类:抽象迭代器类类型的具体迭代器类对象集合字段
  • 具体集合类:重写抽象创建迭代器方法为具体创建迭代器方法
  • 具体创建迭代器方法:参数发送当前具体集合类对象(this)
  • 客户端:创建具体集合类对象,具体集合类对象调用具体集合类的具体创建迭代器方法,创建抽象迭代器类类型的具体迭代器类对象(一个集合有多个迭代器,每个迭代器都持有集合),抽象迭代器类类型的具体迭代器类对象调用具体获取起始对象方法和具体获取下个对象方法(迭代器从集合中获取起始迭代器和下个迭代器)

核心:

  • 继承
  • 多态
  • 分离集合对象的遍历行为
  • 类比: 旅游向导带领旅客依次参观各个景点

解释器模式(Interpreter)

描述:

  • 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

结构:

  • 抽象表达式类——与上下文类是依赖关系
  • 终结符表达式类——与抽象表达式类是继承关系
  • 非终结符表达式类——与抽象表达式类是继承关系
  • 上下文类对象

概述:

  • 抽象表达式类:抽象解释方法
  • 抽象解释方法:参数接收上下文类对象
  • 终结符表达式类:重写抽象解释方法为具体解释方法
  • 非终结符表达式类:重写抽象解释方法为具体解释方法
  • 上下文类:信息字段,设置信息方法,获取信息方法
  • 设置信息方法:设置信息字段
  • 获取信息方法:返回信息字段
  • 客户端:创建上下文类对象,上下文类对象调用设置信息方法,创建抽象表达式类类型的终结符表达式类对象(树叶)和抽象表达式类类型的非终结符表达式类对象(树枝)(反向创建:先创建树枝,后创建树叶),调用抽象表达式类类型的非终结符表达式类对象和抽象表达式类类型的终结符表达式类对象的具体解释方法(正向解释:先解释树枝,后解释树叶;树状递归的解释方式)

核心:

  • 继承
  • 多态
  • 分离解释行为
  • 可能是树状递归的解释方式
  • 类比: 客户语音命令音箱播放音乐,音箱解释器将语音解释成信息,将信息解释成指令并完成任务

中介者模式(Mediator)

别名:

  • 调停者模式(Intermediary)
  • 控制器模式(Controller)

描述:

  • 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

结构:

  • 抽象中介者类
  • 具体中介者类——与抽象中介者类是继承关系,与具体组件者类是关联关系
  • 抽象组件类——与抽象中介者类是关联关系
  • 具体组件类:与抽象组件类是继承关系

概述:

  • 抽象中介者类:抽象发送方法
  • 具体中介者类:具体组件类对象字段
  • 具体中介者类:设置具体组件类对象为字段方法,重写抽象通知方法为具体通知方法
  • 设置具体组件类对象为字段方法:设置具体组件类对象为字段——中介者认识组件
  • 具体通知方法:参数接收抽象组件类类型的具体组件类对象和信息,其他抽象组件类类型的具体组件类对象调用具体组件类的接收方法——其他组件接收中介者的通知
  • 抽象组件类:抽象中介者类类型的具体中介者类对象字段
  • 抽象组件类:设置抽象中介者类类型的具体中介者类对象为字段方法
  • 设置抽象中介者类类型的具体中介者类对象为字段方法:设置抽象中介者类类型的具体中介者类对象为字段——组件认识中介者
  • 具体组件类:具体发送方法,具体接收方法
  • 具体发送方法:参数接收信息,抽象中介者类类型的具体中介者类对象调用具体中介者类的具体发送方法,参数发送当前具体组件类对象(this)和信息——当前组件委托中介者发送通知
  • 客户端: 创建具体组件类对象和具体中介者类对象,具体组件类对象调用抽象组件类的设置抽象中介者类类型的具体中介者类对象为字段方法——组件认识中介者,具体中介者类对象调用具体中介者类的设置具体组件类对象为字段方法——中介者认识组件,当前具体组件类对象调用具体组件类的具体发送方法——当前组件委托中介者发送通知,其他组件接收中介者的通知

核心:

  • 继承
  • 多态
  • 类比: 当前用户通过手机和网络发送信息,其他用户通过手机和网络接收信息

访问者模式(Visitor)

描述:

  • 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

结构:

  • 抽象访问者类
  • 具体访问者类——与抽象访问者类是继承关系
  • 抽象元素类
  • 具体元素类——与抽象元素类是继承关系
  • 对象结构类——与抽象元素类是关联关系

概述:

  • 抽象访问者类:抽象访问方法
  • 具体访问者类:重写抽象访问方法为具体访问方法
  • 具体访问方法:参数接收具体元素类对象,使用具体元素类对象
  • 抽象元素类:抽象接收方法
  • 具体元素类:重写抽象接收方法为具体接收方法
  • 具体接收方法:参数接收抽象访问者类类型的具体访问者类对象,抽象访问者类类型的具体访问者类对象调用具体访问方法,参数发送当前具体元素类对象(this)——访问者访问
  • 对象结构类:抽象元素类类型的具体元素类对象集合字段,增加抽象元素类类型的具体元素类对象为字段方法,减少抽象元素类类型的具体元素类对象为字段方法,接收方法
  • 增加抽象元素类类型的具体元素类对象为字段方法:增加抽象元素类类型的具体元素类对象到集合字段
  • 减少抽象元素类类型的具体元素类对象为字段方法:从集合字段减少抽象元素类类型的具体元素类对象
  • 接收方法:参数接收抽象访问者类类型的具体访问者类对象,遍历抽象元素类类型的具体元素类对象集合字段,抽象元素类类型的具体元素类对象调用具体元素类的具体接收方法
  • 客户端:创建对象结构类对象,创建具体元素类对象,对象结构类对象调用增加抽象元素类类型的具体元素类对象为字段方法,创建具体访问者类对象,对象结构类对象调用对象结构类的接收方法

核心:

  • 继承
  • 多态
  • 分离稳定的数据结构和变化的算法(访问者)
  • 双分派:算法访问数据结构(第一次分派),依据数据结构执行相关操作(第二次分派)
  • 类比: 保险推销员依据建筑物类型提供不同保单:为居民楼推销医疗保险,为银行推销失窃保险
  • 类比理解:稳定的数据结构:医疗保险和失窃保险,变化的算法/行为/访问者:居民楼和银行。访问者访问:保险推销员依据建筑物类型(第一次分派),提供不同保单(保单中信息和建筑物类型相关)(第二次分派)

参考资料

  • 《大话设计模式》作者:程杰
  • 常用设计模式有哪些? (refactoringguru.cn)
  • GoF设计模式(十五):Interpreter Pattern 解释器模式 - 知乎 (zhihu.com)

总结

行为型设计模式总结。


作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

你可能感兴趣的:(设计模式,设计模式,模板方法模式,策略模式,命令模式,观察者模式)