意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
何时使用:有一些通用的方法,却在每一个子类都重新写了这一方法。
优点: 1、封装不变部分,扩展可变部分,符合ocp。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:
- 类数目增加
- 增加了系统实现的复杂度
- 模版方法通过继承实现,而继承自身的缺点是,如果父类添加新的抽象方法,子类都要改一遍
使用场景:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。比如往冰箱里放东西这个操作,打开门和关上门的操作是不变的,具体放什么可以改变。
- 各子类中公共的行为被提取出来,放到一个公共父类中,从而避免代码的重复。
模版方法模式在JDK中的体现
ArrayList
的get
方法就是实现了父类AbstractList
的抽象get
方法,同样AbstractSet
、AbstractMap
也是同理,该开放的开放,该自己实现的自己实现。以及Comparable
接口的ComparTo
方法就是使用了模版方法模式,让我们可以自定义排序的规则等等。还有Servlet
中的doGet
与doPost
方法。