📌 行为型模式
🎯 主要特点
- 描述了对象如何协作完成单个行为。
- 聚焦于运行时对象的状态。
- 描述多个类或对象如何互相通信和如何依赖。
🎯 核心组成
- 调用者: 发起请求的对象。
- 接收者: 接受请求并执行相应操作的对象。
- 命令: 表示请求的对象。
行为型模式关注对象的责任和它们之间的交互。它处理对象间的通信和协调,使得对象间的交互更加灵活、高效。可以按照其目的和特点进行以下分类:
🎯 对象间协作模式
- 观察者模式 (Observer): 当一个对象的状态发生改变时,其依赖对象都会得到通知。
- 中介者模式 (Mediator): 减少对象间的耦合,使得对象之间可以简单地互相引用。
- 迭代器模式 (Iterator): 提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的底层表示。
🎯 对象间职责划分模式
- 策略模式 (Strategy): 定义一系列算法,并将每个算法封装在具有共同接口的独立的类中。
- 状态模式 (State): 允许对象在其内部状态改变时改变其行为。
- 模板方法模式 (Template Method): 定义算法的骨架,将一些步骤延迟到子类中。
- 访问者模式 (Visitor): 在不改变数据结构的前提下,增加作用于其上的新操作。
🎯 请求处理模式
- 责任链模式 (Chain of Responsibility): 为请求创建了一个接收者对象的链。
- 命令模式 (Command): 将请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求,以及支持可撤销的操作。
- 解释器模式 (Interpreter): 提供了评估语言的语法或表达式的方式,主要用于特定类型的问题。
🎯 对象行为模式
- 备忘录模式 (Memento): 捕获并保存对象的内部状态,以便可以恢复为先前的状态。
⚠️ 注意: 行为型模式主要是关于如何定义对象之间的协作,以完成主要或分布式任务,同时又不必使对象之间的关系变得固定且难以维护。
⚡️ 5.1 模板方法模式
- 📜 定义:
提高代码复用性
,将相同部分的代码放在抽象的父类中。- 将不同的代码放入不同的子类中。实现了反向控制,通过一个父类调用其子类的操作,实现了反向控制,并符合“开闭原则”。
- 🔗 了解更多
- 🏗️ 结构:
抽象类
:包括抽象方法、具体方法和钩子方法。具体子类
:实现抽象类中定义的抽象方法和钩子方法。
⚡️ 5.2 策略模式
- 📜 定义:
定义了一系列算法
,并将每个算法封装起来,使它们可以相互替换。策略模式属于对象行为模式。 - 🔗 了解更多
- 🏗️ 结构:
抽象策略(Strategy)类
: 定义所有具体策略类所需的接口。具体策略(Concrete Strategy)类
: 提供具体的算法实现或行为。环境(Context)类
: 持有策略类的引用,最终供客户端调用。
⚡️ 5.3 命令模式
- 📜 定义:
将一个请求封装
为一个对象,分隔请求发出和执行的责任。 - 🔗 了解更多
- 🏗️ 结构:
抽象命令类(Command)
: 定义命令的接口。具体命令(Concrete Command)类
: 实现命令接口的具体命令。实现者/接收者(Receiver)
: 真正执行命令的对象。调用者/请求者(Invoker)
: 持有命令对象,是命令执行的入口。
⚡️ 5.4 责任链模式
- 📜 定义: 将请求的处理者通过前一对象记录其下一个对象的引用而连成一条链。
- 🔗 了解更多
- 🏗️ 结构:
抽象处理者(Handler)
: 定义处理请求的接口。具体处理者(Concrete Handler)
: 实现抽象处理者的处理方法。客户类(Client)
: 创建处理链,并向链头提交请求。
⚡️ 5.5 状态模式
- 📜 定义: 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中。
- 🔗 了解更多
- 🏗️ 结构:
环境(Context)
: 维护一个当前状态。抽象状态(State)
: 定义一个接口以封装与环境对象的交互。具体状态(Concrete state)
: 实现抽象状态所对应的行为。
⚡️ 5.6 观察者模式
- 📜 定义: 定义了一种一对多的依赖关系,使多个观察者对象同时监听某一个主题对象。
- 🔗 了解更多
- 🏗️ 结构:
Subject
: 抽象主题,提供增加和删除观察者对象的接口。
ConcreteSubject
: 具体主题,当状态变化时,通知所有的观察者。Observer
: 抽象观察者,定义了一个更新接口。ConcrereObserver
: 具体观察者,实现抽象观察者定义的更新接口。
⚡️ 5.7 中介者模式
- 📜 定义: 定义一个中介角色来封装对象之间的交互。
- 🔗 了解更多
- 🏗️ 结构:
抽象中介者(Mediator)
: 提供同事对象注册与转发的接口。具体中介者(ConcreteMediator)
: 实现中介者接口。抽象同事类(Colleague)
: 定义了一个接受中介者的方法。具体同事类(Concrete Colleague)
: 实现抽象同事类的方法。
⚡️ 5.8 迭代器模式
- 📜 定义: 提供一个对象来顺序访问聚合对象中的数据,而不暴露聚合对象的内部表示。
- 🔗 了解更多
- 🏗️ 结构:
抽象聚合(Aggregate)
: 定义存储、添加、删除元素以及创建迭代器对象的接口。具体聚合(ConcreteAggregate)
: 实现抽象聚合类。抽象迭代器(Iterator)
: 定义访问和遍历元素的接口。具体迭代器(ConcreteIterator)
: 实现抽象迭代器接口。
⚡️ 5.9 访问者模式
- 📜 定义: 封装一些对某种数据结构中的元素的操作,而不改变这个数据结构。
- 🔗 了解更多
- 🏗️ 结构:
抽象访问者(Visitor)
: 定义了对每一个元素的访问行为。具体访问者(ConcreteVisitor)
: 提供对每一个元素类访问时所产生的具体行为。抽象元素(Element)
: 定义了一个接受访问者的方法。具体元素(ConcreteElement)
: 实现抽象元素的方法。对象结构(Object Structure)
: 定义当中所提到的对象结构。
⚡️ 5.10 备忘录模式
- 📜 定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 🔗 了解更多
- 🏗️ 结构:
发起人(Originator)
: 记录当前的内部状态。备忘录(Memento)
: 负责存储发起人的内部状态。管理者(Caretaker)
: 对备忘录进行管理,提供保存与获取备忘录的功能。
⚡️ 5.11 解释器模式
- 📜 定义: 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 🔗 了解更多
- 🏗️ 结构:
抽象表达式(AbstractExpression)
: 定义解释器的接口。终结符表达式(Terminal Expression)
和非终结符表达式(Nonterminal Expression)
: 是抽象表达式的子类。环境(Context)
: 通常包含各个解释器需要的数据或公共的功能。客户端(Client)
: 主要任务是将需要分析的句子或表达式转换为解释器的抽象语法树。