一、定义
模板方法模式的核心设计思路,是通过在抽象类中定义抽象方法的执行顺序,并将抽象方法设定为只有子类实现,
但不设计独⽴立访问的方法。简单说也就是把你安排的明明白白的。
二、类图
- 模板方法(templateMethod): 抽取子类公共逻辑,并定义子类调用顺序
- 基本方法(doSomething/doAnything): 子类独有的具体实现逻辑
三、代码
抽象模板类
public abstract class AbstractClass {
protected abstract void doSomething();
protected abstract void doAnything();
public void templateMethod(){
System.out.println("实现子类公共逻辑");
doSomething();
doAnything();
}
}
具体模板类
public class ConcreteLogicOne extends AbstractClass {
@Override
protected void doSomething() {
System.out.println("ConcreteLogicOne逻辑处理1");
}
@Override
protected void doAnything() {
System.out.println("ConcreteLogicOne逻辑处理2");
}
}
public class ConcreteLogicTwo extends AbstractClass {
@Override
protected void doSomething() {
System.out.println("ConcreteLogicTwo逻辑处理1");
}
@Override
protected void doAnything() {
System.out.println("ConcreteLogicTwo逻辑处理2");
}
}
场景类
public class testController {
public static void main(String[] args) {
AbstractClass concreteLogicOne = new ConcreteLogicOne();
concreteLogicOne.templateMethod();
ConcreteLogicTwo concreteLogicTwo = new ConcreteLogicTwo();
concreteLogicTwo.templateMethod();
}
}
结果:
四、优缺点
优点:
- 封装不变部分,扩展可变部分,提高扩展性
- 提取公共部分代码,便于维护,提高复用性
- 行为由父类控制,子类实现,符合开闭原则
缺点:
- 抽象类继承缺点,父类增加了方法,子类需要都实现
- 子类影响父类,子类返回数据到父类,父类进行逻辑处理。子类间接影响了父类结果,提高了阅读代码复杂度
- 每实现具体逻辑都需要增加子类,导致类数量增加,提高了系统复杂性