源无极

导航

 

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 }

 

结果输出

倒油
热油
下锅的蔬菜是包菜
下锅的酱料是辣椒
炒啊炒啊炒到熟

倒油
热油
下锅的蔬菜是菜心
下锅的酱料是蒜蓉
炒啊炒啊炒到熟

通过上述这个常见的生活例子,我相信你已经完全明白了模板方法模式的原理了!!

 

posted on 2018-12-14 21:22  源无极  阅读(91)  评论(0编辑  收藏  举报