未完待续……
参考链接:
1. 模板方法模式(Template Method)
2. 设计模式之禅——模板方法模式&钩子方法
也称为(其他名称)
定义
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
模板方法模式:
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
核心:
处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。
即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。
说白了,就是==将一些相同操作的代码,封装成一个算法的骨架。核心的部分留在子类中操作,在父类中只把那些骨架做好==
模板方法模式是一种==基于继承的代码复用技术==,它是一种类==行为型==模式。
目的、思想
UML图
涉及对象(特有名词)
- 钩子方法(挂钩):通过钩子方法我们还是能够影响到模板方法的执行(不是影响它的逻辑)
缺点
优点
- 封装不变的内容,扩展可变部分,如果我们要添加一个H3悍马模型,只需要继承父类就可以了。
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现。基本方法是由子类实现的,因此子类可以通过拓展的方法增加相应的功能,符合开闭原则。
区别(对比易混淆模式)
模式 | 叙述 |
---|---|
策略模式 | 封装可互换的行为,然后使用委托来决定要采用哪一个行为 |
模板方法 | 子类决定如何实现算法中的步骤 |
工厂方法 | 由子类决定实例化哪个具体类 |
适用场景
- 实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分容易变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
- 多个子类有公有的方法,并且逻辑基本相同时
重复、复杂的算法,可以把核心算法设计为模板方法,周边的细节则有各个子类实现。 - 代码重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后用钩子方法(见下面的”模板方法拓展“)约束其行为。
典型应用案例
其实,各个框架中,都有模板方法模式的影子。
- 数据库访问的封装
- Junit单元测试
- servlet中关于doGet/doPost方法的调用
- Hibernate中模板程序
- spring中JDBCTemplate,HibernateTemplate等等
- java.util.Arrays#sort(java.lang.Object[])方法排序,对象需要实现compareTo()方法