定义操做中的算法框架,而将具体的操做定义延迟到子类中实现,使得子类在不改变算法结构的状况下依然能够从新定义 算法的某些特定步骤
理解:就像是书的目录,老师已经制定好书的章节,分配给学生按照目录完成书籍,学生按照本身的知识填写目录内容
模板方法应用普遍,也比较简单,仅仅使用了Java的继承机制 AbstractParentClass 称为抽象模板,抽象模板中的方法分为两类: · 基本方法:由子类实现的方法, · 模板方法:通常是一个具体的方法,也就是一个算法框架(调用逻辑),实现对基本方法调度,完成固定逻辑 AClass 和 BClass 称为具体模板:主要是实现抽象模板中的基本方法 注意:为了防止恶意操做,模板方法通常都加final关键字 基本方法尽可能设计成protected类型(符合迪米特法则:不须要暴露的属性和方法尽可能设置为protected类型),若非必要不要扩大 方法的访问权限
· 封装不变部分,扩展可变部分算法
把认为不可变的部分封装到父类实现,可变部分则能够经过继承来继续扩展
· 提取公共部分代码,便于维护框架
· 行为由父类控制,子类实现ide
按照设计习惯通常是定义抽象后实现,但模板方法模式定义了部分实现,子类的实现改变告终果,带来了阅读上难度
1. 多个子类有相同的方法,且逻辑基本相同 2. 重要复杂的算法,可把核心算法封装为模板方法 3. 重构时
public abstract class AbstractCommand { /** * HOOK METHOD * @return */ protected abstract boolean pre() ; protected abstract void after() ; protected abstract void run(); public final void executeRun(){ if(pre()){ run(); after(); } } }
public class ACommand extends AbstractCommand { @Override protected boolean pre() { return true; } @Override protected void after() { System.out.println("执行了A after()"); } @Override protected void run() { System.out.println("执行了A run()"); } }
public class BCommand extends AbstractCommand { @Override protected boolean pre() { return false; } @Override protected void after() { System.out.println("执行了B after()"); } @Override protected void run() { System.out.println("执行了B run()"); } }
public class Test { public static void main(String[] args) { ACommand a = new ACommand(); BCommand b = new BCommand(); a.executeRun(); b.executeRun(); } }
增长钩子方法(Hook Method) 当须要增长外部条件时,增长钩子方法便可改变执行结果