1. 实例概况
- 背景:小成希望学炒菜:手撕包菜 & 蒜蓉炒菜心
- 冲突:两道菜的炒菜步骤有的重复有的却差异很大,记不住
- 解决方案:利用代码记录下来
b. 使用步骤
步骤1: 创建抽象模板结构(Abstract Class):炒菜的步骤
1 public abstract class Abstract Class { 2 //模板方法,用来控制炒菜的流程 (炒菜的流程是一样的-复用) 3 //申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序 4 final void cookProcess(){ 5 //第一步:倒油 6 this.pourOil(); 7 //第二步:热油 8 this.HeatOil(); 9 //第三步:倒蔬菜 10 this.pourVegetable(); 11 //第四步:倒调味料 12 this.pourSauce(); 13 //第五步:翻炒 14 this.fry(); 15 } 16 17 //定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的 18 19 //第一步:倒油是一样的,所以直接实现 20 void pourOil(){ 21 System.out.println("倒油"); 22 } 23 24 //第二步:热油是一样的,所以直接实现 25 void HeatOil(){ 26 System.out.println("热油"); 27 } 28 29 //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心) 30 //所以声明为抽象方法,具体由子类实现 31 abstract void pourVegetable(); 32 33 //第四步:倒调味料是不一样的(一个下辣椒,一个是下蒜蓉) 34 //所以声明为抽象方法,具体由子类实现 35 abstract void pourSauce(); 36 37 38 //第五步:翻炒是一样的,所以直接实现 39 void fry();{ 40 System.out.println("炒啊炒啊炒到熟啊"); 41 } 42 }
步骤2: 创建具体模板(Concrete Class),即”手撕包菜“和”蒜蓉炒菜心“的具体步骤
1 //炒手撕包菜的类 2 public class ConcreteClass_BaoCai extend Abstract Class{ 3 @Override 4 public void pourVegetable(){ 5 System.out.println(”下锅的蔬菜是包菜“); 6 } 7 @Override 8 public void pourSauce(){ 9 System.out.println(”下锅的酱料是辣椒“); 10 } 11 } 12 //炒蒜蓉菜心的类 13 public class ConcreteClass_CaiXin extend Abstract Class{ 14 @Override 15 public void pourVegetable(){ 16 System.out.println(”下锅的蔬菜是菜心“); 17 } 18 @Override 19 public void pourSauce(){ 20 System.out.println(”下锅的酱料是蒜蓉“); 21 } 22 }
**步骤3: **客户端调用-炒菜了
1 public class Template Method{ 2 public static void main(String[] args){ 3 4 //炒 - 手撕包菜 5 ConcreteClass_BaoCai BaoCai = new ConcreteClass_BaoCai(); 6 BaoCai.cookProcess(); 7 8 //炒 - 蒜蓉菜心 9 ConcreteClass_ CaiXin = new ConcreteClass_CaiXin(); 10 CaiXin.cookProcess(); 11 } 12 13 }
结果输出
倒油
热油
下锅的蔬菜是包菜
下锅的酱料是辣椒
炒啊炒啊炒到熟
倒油
热油
下锅的蔬菜是菜心
下锅的酱料是蒜蓉
炒啊炒啊炒到熟
通过上述这个常见的生活例子,我相信你已经完全明白了模板方法模式的原理了!!