1. 模板方法模式定义:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。是的子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
2. 模板方法模式的实现很简单,其原理是Java的继承机制,它主要包含2个角色,抽象模板角色和具体模板角色
3. 通用示例代码:
抽象模板类:
public abstract class AbstractTemplate { //基本方法 protected abstract void doAnything(); //基本方法 protected abstract void doSomething(); //模板方法 public final void templateMethod(){ this.doAnything(); this.doSomething(); } }基本方法:基本方法也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。
模板方法:可以有一个或多个,一般是一个具体的方法,实现对基本方法的调度,完成固定的逻辑
注:为了防止子类任意重写模板方法,模板方法一般都是用final关键字修饰
具体模板类:
public class ConcreteTemplate extends AbstractTemplate { @Override protected void doAnything() { System.out.println("do anything...."); } @Override protected void doSomething() { System.out.println("do something...."); } }
public class ConcreteTemplate1 extends AbstractTemplate { @Override protected void doAnything() { System.out.println("do anything1...."); } @Override protected void doSomething() { System.out.println("do something1...."); } }测试类:
public class Test { public static void main(String[] args) { AbstractTemplate aTemplate=new ConcreteTemplate(); AbstractTemplate aTemplate1=new ConcreteTemplate1(); aTemplate.templateMethod(); aTemplate1.templateMethod(); } }4. 模板方法模式的优点:
a、 封装不变部分,扩展可变部分
把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。
b、 提取公共部分代码,便于维护
c、 行为由父类控制,子类实现
基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。
5. 模板方法模式的额使用场景:
a、 多个子类有公有的方法,并且逻辑基本相同时。
b、重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
c、 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
6. 测试例子对应的类图: