模板方法模式

要做一件事情,如果这件事件的过程中,基本步骤是一致的。就可以将这几步骤弄成一个函数。如何需要看情况,对其中的某一个步骤是否调用,则可用一个钩子函数,即通过虚函数重写一个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 }

 

posted @ 2020-03-24 09:16  撑雨伞的小男孩  阅读(158)  评论(0编辑  收藏  举报