设计模式 之 模版模式

来源:互联网 发布:网络安全教育黑板报 编辑:程序博客网 时间:2024/05/16 12:47

template method (模版模式)

前传:

模版模式是我的初恋。我和她最好相识在在mfc里面,她留给我良好的印象。

而后,各级政府开始大行其道,上有政策,下有对策,成为它存在的依据。

实现:

这个模式实现的手段:一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。

延迟的核心技术就是:多态    

还是举个例子吧:

class 丈母娘

{

public:

结婚要求(成员方法)

聘礼(){ 有下限(10万),无上限 }

首饰(){几件吧}

房子(){100平}

汽车(){最少12万的别克}

 }

}


class 女儿 :public class 丈母娘

public:

结婚要求(成员方法)

聘礼(){多少给点吧};

首饰(){几件吧};

房子(){50平的二手房};

汽车(){国产品牌车QQ};

 }

     }


一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。

好处:子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。

父类定义框架,子类实现其中的一部分

好处: 提供了一个代码复用方法。

号外:

在模版模式中使用挂钩(hook)

  实现方法 :写一个多态的,空实现的 占位函数,让子类决定要不要实现它


以下网上一个兄弟的例子似乎比我的例子好一点。(出处http://meigesir.iteye.com/blog/1506484

冲泡咖啡和冲泡茶的例子

加工流程:

咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶

茶冲泡法:   1.把水煮沸、2.用沸水冲泡茶叶、3.把  茶 倒进杯子、4.加蜂蜜


实践步骤:

1>创建一个模板(抽象)类:Beverage(饮料)

Java代码  收藏代码
  1. package com.kaishengit.beverage;  
  2.   
  3. public abstract class Beverage {  
  4.     /** 
  5.      * 冲泡咖啡或茶...流程 
  6.      */  
  7.     public final void create(){  
  8.         boilWater();//把水煮沸  
  9.         brew();//用沸水冲泡...  
  10.         pourInCup();//把...倒进杯子  
  11.         addCoundiments();//加...  
  12.     }  
  13.   
  14.   
  15.     public abstract void addCoundiments();  
  16.   
  17.     public abstract void brew();  
  18.       
  19.     public void boilWater() {  
  20.         System.out.println("煮开水");  
  21.     }  
  22.       
  23.     public void pourInCup() {  
  24.         System.out.println("倒进杯子");  
  25.     }  
  26. }  

 

 2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类

1.咖啡(Coffee)

 

Java代码  收藏代码
  1. package com.kaishengit.beverage;  
  2.   
  3. public class Coffee extends Beverage{  
  4.   
  5.     @Override  
  6.     public void addCoundiments() {  
  7.         System.out.println("添加糖和牛奶");   }  
  8.   
  9.     @Override  
  10.     public void brew() {  
  11.         System.out.println("用水冲咖啡");  
  12.     }  
  13. }  

 

 

2.茶(Tea)

 

Java代码  收藏代码
  1. package com.kaishengit.beverage;  
  2.   
  3. public class Tea extends Beverage{  
  4.   
  5.     @Override  
  6.     public void addCoundiments() {  
  7.         System.out.println("添加蜂蜜");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void brew() {  
  12.         System.out.println("用水冲茶");  
  13.     }  
  14.   
  15. }  


0 0