定义
- 模板模式是行为型设计模式。
- 在一个算法流程或者执行流程里,把一系列公共不会变动的算法提取出来。把需要改动的一块代码抽象出来交给子类去重写。通俗的讲就是很多相同步骤的流程里,可能在某个步骤里存在差别。例如在《大话设计模式》中提到的考试场景模式,学生们的试卷都是一样的,只是学生回答的答案不一样,这种场景就适合使用模板模式。
代码实现
/**
* 模板抽象类
*
* @Author: ZRH
* @Date: 2021/2/9 11:39
*/
public abstract class AbstractPaper {
/**
* 不可变的执行流程模板方法
*/
public final void templateMethod() {
System.err.println("问题A :xxx***xxx***?");
abstractAnswerA();
System.err.println("问题B :xxx***xxx***?");
abstractAnswerB();
System.err.println("问题C :xxx***xxx***?");
abstractAnswerC();
}
/**
* 抽象答案方法
*/
public abstract void abstractAnswerA();
/**
* 抽象答案方法
*/
public abstract void abstractAnswerB();
/**
* 抽象答案方法
*/
public abstract void abstractAnswerC();
}
/**
* 模板方法
*
* @Author: ZRH
* @Date: 2021/2/9 11:47
*/
public class TemplateUserA extends AbstractPaper {
@Override
public void abstractAnswerA() {
System.err.println("问题A的答案是 A");
}
@Override
public void abstractAnswerB() {
System.err.println("问题B的答案是 B");
}
@Override
public void abstractAnswerC() {
System.err.println("问题C的答案是 C");
}
}
/**
* 测试模板方法
* @param args
*/
public static void main(String[] args) {
new TemplateUserA().templateMethod();
}
问题A :xxx***xxx***?
问题A的答案是 A
问题B :xxx***xxx***?
问题B的答案是 B
问题C :xxx***xxx***?
问题C的答案是 C
使用场景和优劣势
- 模板模式是实际项目或源码中使用非常多的一种设计模式,例如spring的JdbcTemplate,事务管理器AbstractPlatformTransactionManager,MVC控制器等等。还有根据项目业务需求也可以且容易使用模板模式。
- 优点 :在其父类提取了公共不变的算法模板, 其子类扩展了可变化算法流程,提高了代码复用性。符合对修改关闭,对扩展开发的原则。
- 缺点 :每个不同的实现都需要增加子类,提升了代码复杂度,项目类数量增加也会加大JVM类加载负荷。父类的抽象方法依赖子类的实现,所以父类的执行结果依赖于子类执行结果,这种结构提升了代码阅读的困难性。
和策略模式的区别
- 策略模式类之间关系多用组合/实现,少用继承。而模板模式中算法类使用继承方式。
- 策略模式注重策略实现类的组织和调用。而模板模式注重模板类中模板方法的实现。