程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++設計模式]template 模板方法模式

[C++設計模式]template 模板方法模式

編輯:C++入門知識

[C++設計模式]template 模板方法模式


模板法模式:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。

按照《headfirst 設計模式》的例子,煮茶和煮咖啡的算法框架(流程)是一樣的,只是有些算法的實現是不一樣的,有些是一樣的。
我們可以將共同的算法框架封裝為一個虛基類,將相同的算法聲明為不可覆蓋的(static),不同的算法聲明為子類要實現的純虛函數。
可以使用hook()函數處理算法框架的細小差異。

看到這裡,或許會想起策略模式。策略模式也是將可以改變的算法和不輕易改變的算法區別對待,但策略模式和模板方法模式的最根本區別是:
策略模式是采用類組合,將不變的算法仍保留在原來類中,只是將要重載的算法單獨封裝為一個虛基類,子類實現自己的版本,這樣原來的類就
可以組合不同的接口子類,調用不同的算法。
模板方法模式是采用類繼承,將算法框架(步驟)封裝為一個虛基類,而且算法框架是不可覆蓋的,子類只能對個別步驟有不同的實現。基類也可以引入hook()函數來對算法框架微調。hook()鉤子函數的原理很簡單,基類的hook()函數可以定義為空,也可以定義一些操作,子類可以對基類的hook()函數進行重載。
 

\

下面是不帶hook()鉤子的模板方法模式:

 

class CaffeineBeverage  //咖啡因飲料
{
public:
 void PrepareRecipe() //咖啡因飲料沖泡法
 {
  BoilWater();  //把水煮沸
  Brew();    //沖泡
  PourInCup();  //把咖啡因飲料倒進杯子
  AddCondiments(); //加調料
 }
 void BoilWater()
 {std::cout << 把水煮沸 << std::endl;}
 virtual void Brew() = 0;
 void PourInCup()
 {std::cout << 把咖啡倒進杯子 << std::endl;}
 virtual void AddCondiments() = 0;
};
class Coffee : public CaffeineBeverage
{
public:
 void Brew()
 {std::cout << 用沸水沖泡咖啡 << std::endl;}
 void AddCondiments()
 {std::cout << 加糖和牛奶 << std::endl;}
};
class Tea : public CaffeineBeverage
{
public:
 void Brew()
 {std::cout << 用沸水浸泡茶葉 << std::endl;}
 void AddCondiments()
 {std::cout << 加檸檬 << std::endl;}
};
int main(void)
{
 std::cout << 沖杯咖啡: << std::endl;
 Coffee c;
 c.PrepareRecipe();
 std::cout << std::endl;
 std::cout << 沖杯茶: << std::endl;
 Tea t;
 t.PrepareRecipe();
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved