首页 > 代码库 > C++设计模式实现--模板(Template)模式

C++设计模式实现--模板(Template)模式

一. 问题

在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template提供了这种情况的一个实现框架。

二. 模式

Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节

三. 代码

[cpp] view plaincopy
  1. //抽象基类,实现了一个模板方法  
  2. class AbstractClass  
  3. {  
  4. public:  
  5.     virtual ~AbstractClass()  
  6.     {  
  7.     }  
  8.   
  9.         //模板方法,只在抽象基类中实现  
  10.     void TemplateMethod()  
  11.     {  
  12.         this->PrimitiveOperation1();  
  13.         this->PrimitiveOperation2();  
  14.     }  
  15.   
  16. protected:  
  17.     virtual void PrimitiveOperation1() = 0;  
  18.   
  19.     virtual void PrimitiveOperation2() = 0;  
  20.   
  21.     AbstractClass()  
  22.     {  
  23.     }  
  24. };  
  25.   
  26. //具体子类,实现操作的特定细节  
  27. class ConcreteClass1:public AbstractClass  
  28. {  
  29. public:  
  30.     ConcreteClass1()  
  31.     {  
  32.     }  
  33.   
  34.     ~ConcreteClass1()  
  35.     {  
  36.     }  
  37.   
  38. protected:  
  39.     void PrimitiveOperation1()  
  40.     {  
  41.         cout<<"ConcreteClass1...PrimitiveOperation1"<<endl;  
  42.     }  
  43.   
  44.     void PrimitiveOperation2()  
  45.     {  
  46.         cout<<"ConcreteClass1...PrimitiveOperation2"<<endl;  
  47.     }  
  48. };  
  49.   
  50. //具体子类,实现操作的特定细节  
  51. class ConcreteClass2:public AbstractClass  
  52. {  
  53. public:  
  54.     ConcreteClass2()   
  55.     {  
  56.     }  
  57.   
  58.     ~ConcreteClass2()  
  59.     {  
  60.     }  
  61.   
  62. protected:  
  63.     void PrimitiveOperation1()  
  64.     {  
  65.         cout<<"ConcreteClass2...PrimitiveOperation1"<<endl;  
  66.     }  
  67.   
  68.     void PrimitiveOperation2()  
  69.     {  
  70.         cout<<"ConcreteClass2...PrimitiveOperation2"<<endl;  
  71.     }  
  72. };  
  73.   
  74.   
  75. int main()  
  76. {  
  77.     AbstractClass* p1 = new ConcreteClass1();  
  78.     AbstractClass* p2 = new ConcreteClass2();  
  79.       
  80.     p1->TemplateMethod();  
  81.     p2->TemplateMethod();  
  82.       
  83.     return 0;  
  84. }  
关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。