模板方法模式的定义
模板方法模式(Template Method Pattern) 实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。
模板方法模式 非常简单,其实就是类的继承机制,但它却是一个应用非常广泛的模式。
模板方法模式本质:抽象封装流程,具体进行实现
模板模式的结构
AbstractClass:实现一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。AbstractClass其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法。它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
ConcreteClasses:实现PrimitiveOperation以完成算法与特定子类相关的步骤。ConcreteClass实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
还有一个钩子方法,相当于传入boolean类型的判断,来决定哪些步骤不执行。
举例
cook方法就是流程,这个是固定的,但是wash、pourOil、fry都是需要子类自己实现的。
class Client {
public static void main(String[] args) {
System.out.println("准备炒豆芽");
CookVegetable cookVegetable = new CookBeanSprout();
cookVegetable.cook();
System.out.println();
System.out.println("准备炒茄子");
cookVegetable = new CookEggplant();
cookVegetable.cook();
}
// 抽象模板类:定义炒菜流程
static abstract class CookVegetable {
protected void wash() {
System.out.println("洗菜");
}
protected void pourOil() {
System.out.println("热油下锅");
}
protected void fry() {
System.out.println("下菜翻炒");
}
// 具体调料由菜决定
protected abstract void pourSauce();
// 具体炒菜流程
public final void cook() {
this.wash();
this.pourOil();
this.fry();
this.pourSauce();
System.out.println("起锅吃菜");
}
}
// 豆芽
static class CookBeanSprout extends CookVegetable {
@Override
protected void pourOil() {
System.out.println("热锅少油");
}
@Override
protected void fry() {
System.out.println("快速翻炒");
}
@Override
protected void pourSauce() {
System.out.println("加盐和少量生抽");
}
}
// 茄子
static class CookEggplant extends CookVegetable {
@Override
protected void wash() {
System.out.println("去除头尾,然后用水洗下");
}
@Override
protected void pourOil() {
System.out.println("热锅多油");
}
@Override
protected void pourSauce() {
System.out.println("加盐和鸡精");
}
}
}
链接:https://www.jianshu.com/p/82abdbabe2a5