模板方法模式
要做一件事情,如果这件事件的过程中,基本步骤是一致的。就可以将这几步骤弄成一个函数。如何需要看情况,对其中的某一个步骤是否调用,则可用一个钩子函数,即通过虚函数重写一个bool型判断函数来确定。
代码如下:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 4 using namespace std; 5 6 //抽象的制作饮料方法 7 class MakeDrink 8 { 9 public: 10 //1 把水煮开 11 void boil() { 12 cout << "把水煮开" << endl; 13 } 14 //2 冲某物 15 virtual void brew() = 0; 16 //3 从大杯倒入小杯 17 void putInCup() 18 { 19 cout << "把冲泡好的饮料 从大杯倒入小杯" << endl; 20 } 21 //4 加一些酌料 22 virtual void addThings() = 0; 23 24 //钩子函数, hook 25 virtual bool CustomWantAddThings() { 26 return true; 27 } 28 29 30 //业务的逻辑的统一模板 31 void make() { 32 boil(); 33 brew(); //子类 34 putInCup(); 35 36 if (CustomWantAddThings() == true) { 37 addThings(); //子类的多态 38 } 39 } 40 }; 41 42 //制作咖啡 43 class MakeCoffee :public MakeDrink 44 { 45 public: 46 MakeCoffee(bool isAdd) 47 { 48 this->isAdd = isAdd; 49 } 50 //2 冲某物 51 virtual void brew() 52 { 53 cout << "冲泡咖啡豆" << endl; 54 } 55 56 //4 加一些酌料 57 virtual void addThings() { 58 cout << "添加糖和牛奶" << endl; 59 } 60 61 virtual bool CustomWantAddThings() { 62 return isAdd; 63 } 64 65 private: 66 bool isAdd; 67 }; 68 69 //冲泡茶叶 70 class MakeTea :public MakeDrink 71 { 72 public: 73 MakeTea(bool isAdd) 74 { 75 this->isAdd = isAdd; 76 } 77 78 //2 冲某物 79 virtual void brew() { 80 cout << "冲泡 茶叶" << endl; 81 } 82 //4 加一些酌料 83 virtual void addThings() { 84 cout << "添加 柠檬 或者 菊花" << endl; 85 } 86 87 virtual bool CustomWantAddThings() { 88 return isAdd; 89 } 90 91 private: 92 bool isAdd; 93 }; 94 95 int main(void) 96 { 97 MakeDrink *makeCoffee = new MakeCoffee(true); 98 makeCoffee->make(); 99 100 cout << " ------ " << endl; 101 102 MakeDrink *makeTea = new MakeTea(false); 103 makeTea->make(); 104 105 return 0; 106 }