模板方法模式
基本概念
模板方法模式:属于行为型设计模式,定义一个算法的骨架(模板),将算法中的某些步骤延迟到子类中实现,从而让子类在不改变算法整体结构的前提下,重新定义算法中的特定步骤。
核心结构:
- 抽象类(
Abstract Class
):定义模板方法和基本方法(抽象或具体),模板方法定义算法骨架。 - 具体子类(
Concrete Class
):实现抽象类中的抽象方法,完成算法的具体步骤。
示例说明
场景:设计一个饮品制作系统,制作咖啡和茶的流程相似(煮水、泡制、倒入杯子),但泡制方式和调料添加不同。
- 饮品抽象类, 设计定义通用的方法和流程
1 | // 抽象饮品类(模板方法模式的核心) |
- 子类实现:咖啡、茶
1 |
|
- 验证测试:
1 |
|
- 结果展示:
1 |
|
类图图下:
- 模板方法(
prepareRecipe
):定义了饮品制作的固定流程(煮水→泡制→倒杯→加调料),确保算法骨架不变。 - 差异化步骤(
brew、addCondiments
):由子类实现,不同饮品的泡制和调料添加方式不同。 - 代码复用:抽象类中封装了通用步骤(
boilWater、pourIntoCup
),避免重复代码。
如有必要,抽象类的方法可以采用钩子的形式由子类决定是否使用,如在执行某个步骤时,可以由子类决定是否覆盖重写。这就涉及到一个设计原则:
好莱坞原则:不要打电话给(调用)我们,我们会打电话给(调用)你
好莱坞原则给我们一种防止“依赖腐烂”的方法,“依赖腐烂”的例子如高层组件依赖于低层组件,低层组件又依赖于高层组件,而高层组件又依赖于横向组件,横向组件又依赖于低层组件等。当腐烂蔓延时,没有人可以轻易理解系统是如何设计等。有了好莱坞原则,将允许低层组件把自己挂进高层组件,由高层组件决定是否使用,如何使用。
用到好莱坞原则的模式: 工厂方法模式、观察者模式
总结
优点:
- 复用性高:抽象类封装通用逻辑,子类只需实现差异化逻辑。
- 扩展性好:新增子类时无需修改模板方法,符合开闭原则。
- 统一执行顺序:模板方法确保算法步骤的执行顺序,避免逻辑混乱。
缺点:
- 子类依赖抽象类:子类需严格遵循抽象类定义的模板,灵活性受限于算法骨架。
- 抽象类可能复杂:若模板方法包含过多步骤,抽象类可能变得臃肿。
使用场景:
- 流程固定但细节不同的场景:如文件读取(打开→读取→关闭)、
HTTP
请求处理(连接→请求→响应→断开)。 - 框架设计:如JDK中的
HttpServlet
(doGet
、doPost
是模板方法的具体步骤)、Spring
框架的模板类(如JdbcTemplate
)。 Comparable<T>
接口和Arrays.sort()
: 实现比较大小接口,调用sort()
实现排序
与策略模式的区别:模板方法通过继承实现算法变化,策略模式通过组合实现算法变化。模板方法适合“算法骨架固定、部分步骤变化”,策略模式适合“整个算法可替换”。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Lavigne-yang.Blog!
评论