行为型模式
- 核心作用:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责,共有11种模式。
- 分类:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。
责任链模式 Chain of responsibility
定义
- 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,不能,则传递给链上的下一个对象。
迭代器模式 Iterator
场景
- 提供一种可以遍历聚合对象的方式。又称为:游标cursor模式
- 聚合对象:存储数据
- 迭代器:遍历数据
类图
迭代器一般作为内部类使用,这样可以直接访问聚合对象的内部数据
中介者模式 Mediator
核心
- 如果一个系统种对象之间的联系呈现为网状结构,对象之间存在大量的多对多关系,将导致关系及其复杂,这些对象称为“同事对象”。
- 我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星形结构。
类图
每个具体的同事类持有中介者对象的引用,方法调用中介者的方法,来处理外部事物。
中介者对象中保存了所有的同时类对象。
中介者模式的本质
- 解耦多个同时对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
命令模式 Command
介绍
- 命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求的日志,以及支持可撤销的操作。也称之为:动作Action模式、事物Transaction模式
结构
- Command抽象命令类
- ConcreteCommand具体命令类
- Invoker调用者/请求者
- 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象对象命令类之间存下关联。在程序运行时,将调用命令对象的execute()方法,间接调用接收者的相关操作。
- Receiver接收者
- 接收者执行与请求相关的操作,具体实现对请求的业务处理。
- 未抽向前,实际执行操作内容的对象。
- Client 客户类
- 在客户类中,需要创建调用者对象,具体命令类对象,在创建具体命令对象时,指定对应的接收者。发送者和接收者之间没后直接关系,都是通过命令对象间接调用。
类图
解释器模式 Interpreter
介绍
- 是一种不常用的设计模式
- 用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。
- 当我们需要开发一种新的语言时,可以考虑使用解释器模式。
- 尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用Jruby,Groovy、java的js引擎来替代解释器的作用,弥补java语言的不足
访问者模式 Visitor
模式动机
- 对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同。
定义
- 表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变个元素的类的前提下定义作用于这些元素的新操作。
策略模式 Strategy
策略模式
- 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。
模板方法模式 Template method
状态模式 State
核心
- 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
结构
- Context 环境类:环境类中维护了一个State对象,它定义了当前的状态
- State 抽象状态类
- ConcreteState 具体状态类:每一个类封装了一个状态对应的行为
观察者模式 Observer
备忘录模式 Memento
核心
- 就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
结构
- 源发器类Originator:需要被保存的对象
- 备忘录类Memento:拷贝
- 负责人类CareTaker:管理备忘录