Template Method(模板方法模式)
1、概念理解
定义一个模板结构,将具体内容延迟到子类去实现。在不改变模板结构的前提下在子类中重新定义模板中的内容。
2、主要作用
1. 提高代码复用性,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中;
2. 提高了拓展性,将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为;
3. 实现了反向控制,通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制,符合“开闭原则”。
3、应用场合
1. 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现;
2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
3. 需要控制子类的扩展。
实例:在炒素菜和荤菜的时候,两道菜的炒菜步骤有的重复有的却差别很大:
示例代码:
第一步:创建抽象模板类(abstract class)
package templateMethod;
/**
* 创建抽象模板类(abstract class):炒菜的步骤
*/
public abstract class Cook {
//模板方法,用来控制炒菜的流程 (炒菜的流程是一样的就复用)
//声明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序
final void cookProcess(){
//第一步:倒油
pourOil();
//第二步:热油
HeatOil();
//第三步:倒食材
pourFood();
//第四步:倒调味料
pourSauce();
//第五步:翻炒
fry();
}
//定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的
//第一步:倒油是一样的,所以直接实现
void pourOil(){
System.out.println("第一步:倒油");
}
//第二步:热油是一样的,所以直接实现
void HeatOil(){
System.out.println("第二步:热油");
}
//第三步:倒食材是不一样的(一个倒蔬菜,一个是倒荤菜)
//所以声明为抽象方法,具体由子类实现
abstract void pourFood();
//第四步:倒调味料是不一样的(一个倒辣椒,一个是倒孜然)
//所以声明为抽象方法,具体由子类实现
abstract void pourSauce();
//第五步:翻炒是一样的,所以直接实现
void fry() {
System.out.println("第五步:翻炒");
}
}
第二步:创建具体模板类(Concrete Class)
炒荤菜:
package templateMethod;
/**
* 创建具体模板类(Concrete Class),即炒菜的具体步骤
* 炒荤菜的具体步骤
*/
public class Meat extends Cook {
@Override
public void pourFood(){
System.out.println("第四步:倒入荤菜");
}
@Override
public void pourSauce(){
System.out.println("第五步:倒入孜然");
}
}
炒素菜:
package templateMethod;
/**
* 创建具体模板类(Concrete Class),即炒菜的具体步骤
* 炒素菜的具体步骤
*/
public class Vegetable extends Cook {
@Override
public void pourFood(){
System.out.println("第四步:倒入蔬菜");
}
@Override
public void pourSauce(){
System.out.println("第五步:倒入辣椒");
}
}
第三步:创建执行类,开始执行
package templateMethod;
/**
* 执行类,开始执行具体行为:炒菜
*/
public class Cooking {
public static void main(String[] args) {
System.out.println("炒荤菜的步骤:");
Cook meat = new Meat();
meat.cookProcess();
System.out.println("炒素菜的步骤:");
Cook vegetable = new Vegetable();
vegetable.cookProcess();
}
}