一句话总结
在父类定义算法骨架,把可变步骤交给子类实现。
问题与场景
- 多个流程大致相同,但某些步骤不同。
- 希望复用通用流程,避免重复代码。
- 需要约束执行顺序,同时保留扩展点。
模式意图
定义算法的骨架,将某些步骤延迟到子类中实现,不改变算法结构即可扩展细节。
结构图
角色与职责
- 抽象类:定义模板方法和通用流程。
- 具体类:实现差异化步骤。
大约 3 分钟
在父类定义算法骨架,把可变步骤交给子类实现。
定义算法的骨架,将某些步骤延迟到子类中实现,不改变算法结构即可扩展细节。
把对象在不同状态下的行为封装到不同状态类中,让状态切换替代复杂的条件分支。
允许对象在内部状态改变时改变其行为,看起来像是修改了对象的类。
把可互换的算法封装成策略,让调用方在运行时灵活选择。
定义一系列算法,并将其封装起来,使它们可以互相替换,算法的变化独立于使用它的客户端。
当一个对象状态变化时,自动通知并更新所有依赖它的对象。
定义对象间一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。
将操作从对象结构中抽离出来,让“新增操作”比“新增节点类型”更容易。
表示一个作用于某对象结构中各元素的操作,使你可以在不改变元素类的前提下定义新操作。
用一个“中介者”集中协调多个对象的交互,避免对象之间的网状依赖。
用中介者对象封装一系列对象的交互,使各对象不需要显式地相互引用,从而降低耦合。
在不暴露对象内部结构的前提下,保存并恢复对象的历史状态。
在不破坏封装的前提下捕获并保存对象内部状态,以便之后恢复到该状态。
将集合的遍历逻辑封装在迭代器中,让客户端在不暴露内部结构的情况下顺序访问元素。
提供一种方法顺序访问聚合对象中的各个元素,而无需暴露其内部表示。
把“请求”封装成命令对象,让调用者与执行者解耦,并支持队列、日志、撤销等扩展能力。
将请求封装成对象,使你可以用不同的请求对客户端进行参数化,并支持对请求的排队、记录、撤销等操作。
把一组处理器串成链,请求沿链传递,直到被某个处理器处理或到达链尾。
解耦请求发送者与多个处理者,使多个对象都有机会处理请求,并且可以在运行时灵活组合处理顺序。