模板方法模式 : 定义了一个 算法 的 骨架 , 并允许 子类 为 一个或多个 步骤 提供实现 ;
模板方法模式 可以使 子类 在不改变 算法结构 的前提下 , 重新定义算法的某些步骤 ;
模板方法模式类型 : 行为型 ;
模板方法模式适用场景 :
模板方法模式的目的是 让 子类可以扩展 或 具体实现固定方法的某个具体的步骤 ; 对于模板来说 , 是一套固定的算法 , 通过子类 可以扩展 固定算法中某些算法步骤 ;
模板方法模式优点 :
模板方法模式 将 不变的行为定义在父类中 , 去除子类的重复代码 , 体现其优势 , 提供了一个很好的代码复用平台 ;
模板方法模式缺点 :
模板方法扩展 : 通过 钩子方法进行扩展 ;
钩子方法 是 模板对子类更进一步开方和扩展 ;
模板方法模式与工厂方法模式 : 工厂方法 是 模板方法的一种特殊实现 ;
模板方法模式和策略模式 : 二者都 封装了算法逻辑 ;
模板方法模式不会改变算法流程 , 策略模式是可以改变算法流程的 , 并且策略模式的策略之间可以相互替换 ;
业务场景 : 把大象放进冰箱 ;
package templatemethod;
public abstract class Fridge {
/**
* 模板方法 不能被修改 , 使用 final 修饰 , 不允许子类覆盖该方法
* 防止子类修改模板方法的流程
*/
protected final void store() {
openDoor();
closeDoor();
// 这个钩子方法可以让子类控制模板方法的执行流程
if (needColdStorage()) {
codeStorage();
}
put();
}
/**
* 该方法是不变的 , 不允许子类修改
*/
final void openDoor() {
System.out.println("打开冰箱门");
}
final void codeStorage() {
System.out.println("打开冷藏功能");
}
/**
* 钩子方法 , 子类可以进行覆盖
* 将适当的权限开放给应用层 , 用于控制模板方法流程
* @return
*/
protected boolean needColdStorage() {
return false;
}
/**
* 抽象方法 , 需要子类进行实现
*/
abstract void put();
final void closeDoor() {
System.out.println("关闭冰箱门");
}
}
注意这个类 实现了 钩子方法 , 改变了模板方法的执行流程 ;
package templatemethod;
public class FishFridge extends Fridge {
@Override
void put() {
System.out.println("把鱼放进冰箱");
}
@Override
protected boolean needColdStorage() {
// 需要冷藏存储
return true;
}
}
package templatemethod;
public class ElephantFridge extends Fridge {
@Override
void put() {
System.out.println("把大象放进冰箱");
}
}
package templatemethod;
public class Main {
public static void main(String[] args) {
// 把大象放到冰箱
Fridge elephantFridge = new ElephantFridge();
elephantFridge.store();
System.out.println();
// 把鱼放到冰箱
Fridge fishFridge = new FishFridge();
fishFridge.store();
}
}
执行结果 :
打开冰箱门
关闭冰箱门
把大象放进冰箱
打开冰箱门
关闭冰箱门
冷藏存放
把鱼放进冰箱