定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式比较简单,仅仅使用了java的继承机制,但仍然是一种应用广泛的设计模式。下面看一段通用示例代码:
//抽象模板类 public abstract class AbstractClass{ //基本方法 protected abstract void doSomething(); //基本方法 protected abstract void doAnything(); //模板方法 protected abstract void templateMethod(){ this.doSomething(); this.doAnything(); } } //具体模板类 public class ConcreateClass extends AbstractClass{ //实现基本方法 protected void doSomething(){ } protected void doAnything(){ } } //场景类 public class Client{ public static void main(String[] args){ AbstractClass class1 = new ConcreateClass(); class1.templateMethod(); } }
注意:抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性和方法尽量不要设为protected。实现类若非必要,尽量不要扩大父类中的访问权限。
优点:
- 封装不变部分,扩展可变部分。不变的部分封装到公共抽象类中,可变部分通过继承来扩展。
- 提取公共代码部分,便于维护;
- 行为由父类控制,子类实现。父类通过扩展子类,增加了新方法,实现了反向控制和开闭原则。
缺点:
- 每个不同的实现都需要新建一个子类,增加了类的个数,也增加了系统复杂度。
使用场景:
- 多个子类有公有方法,并且逻辑相同;
- 复杂、核心的方法可以设计为模板方法,相关细节通过子类实现;
- 把相同代码抽取到公共类中,然后通过钩子函数约束其行为。