模板方法模式
意图:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性:
1、一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码 重复。
3、控制子类扩展。模板方法只在特定点调用“h o o k ”操作,这样就只允许在 这些点进行扩展。
UML:
代码实现:
实现小孩子玩的一个游戏:“某某” 和 “某某” 在 “某地” “做某事”!
1 #include <iostream> 2 using namespace std; 3 4 class AbsTract{ 5 public: 6 void Play(); 7 8 virtual char* getPlayer1()=0; 9 virtual char* getPlayer2()=0; 10 virtual char* getAdress()=0; 11 virtual char* whatDo()=0; 12 }; 13 14 class Concrete_A : public AbsTract{ 15 public: 16 virtual char* getPlayer1(); 17 virtual char* getPlayer2(); 18 virtual char* getAdress(); 19 virtual char* whatDo(); 20 }; 21 22 class Concrete_B:public AbsTract{ 23 public: 24 virtual char* getPlayer1(); 25 virtual char* getPlayer2(); 26 virtual char* getAdress(); 27 virtual char* whatDo(); 28 }; 29 30 void AbsTract::Play() 31 { 32 cout<<getPlayer1()<<"和"<<getPlayer2()<<"在"<<getAdress()<<whatDo()<<endl; 33 } 34 35 char* Concrete_A::getPlayer1() 36 { 37 return "小花"; 38 } 39 40 char* Concrete_A::getPlayer2() 41 { 42 return "小白"; 43 } 44 45 char* Concrete_A::getAdress() 46 { 47 return "草地上"; 48 } 49 50 char* Concrete_A::whatDo() 51 { 52 return "奔跑"; 53 } 54 55 char* Concrete_B::getPlayer1() 56 { 57 return "小狗"; 58 } 59 60 char* Concrete_B::getPlayer2() 61 { 62 return "小猫"; 63 } 64 65 char* Concrete_B::getAdress() 66 { 67 return "天空"; 68 } 69 70 char* Concrete_B::whatDo() 71 { 72 return "飞翔"; 73 } 74 75 int main(void) 76 { 77 Concrete_A con1; 78 con1.Play(); 79 Concrete_B con2; 80 con2.Play(); 81 return 0; 82 }
结果是:
小花和小白在草地上奔跑
小狗和小猫在天空飞翔
这里每一个具体的类都可以通过
virtual char* getPlayer1();
virtual char* getPlayer2();
virtual char* getAdress();
virtual char* whatDo();
这些接口进行扩展,但也是受到了一定的限制!