今天读到了<First Head设计模式>装饰器这一章,对文中一开始的例子比较感兴趣.文中介绍了一个咖啡售卖系统如何设计的问题.一开始是通过设计一个基类来计算所用的调料的价格,而用子类来计算特定品种的整体价格.
这里面比较感兴趣的是文中有一个子类的实现: 在子类中直接通过父类名::方法来调用父类的方法,之前不怎么用继承,感到比较新奇,就自己码代码尝试了下.
程序的UML图大致如下,真正重要的函数是cost()函数,用来得出咖啡的最终价格.
1 //Beverage.h 2 #pragma once 3 #include <iostream> 4 using namespace std; 5 6 class Beverage 7 { 8 public: 9 Beverage(bool bMilk, bool bSugar, double dCostMilk, double dCostSugar); 10 virtual ~Beverage(); //基类析构用virtual,为了保证多态析构时能够找到子类的析构函数(不用virtual,基类指针是找不到子类的析构函数的位置的) 11 12 virtual double cost(); 13 bool HasMilk(); 14 bool HasSugar(); 15 protected: 16 private: 17 bool m_bMilk; 18 bool m_bSugar; 19 double m_dCostMilk; 20 double m_dCostSugar; 21 };
1 //Beverage.cpp 2 #include "Beverage.h" 3 4 Beverage::~Beverage() 5 { 6 cout << "Beverage is Over~" << endl; 7 } 8 9 Beverage::Beverage(bool bMilk, bool bSugar, double dCostMilk, double dCostSugar): 10 m_bMilk(bMilk), m_bSugar(bSugar), m_dCostMilk(dCostMilk), m_dCostSugar(dCostSugar) 11 { 12 cout << "Beverage Begins~" << endl; 13 } 14 15 bool Beverage::HasMilk() 16 { 17 return m_bMilk; 18 } 19 20 bool Beverage::HasSugar() 21 { 22 return m_bSugar; 23 } 24 25 //计算配料最终花了多少钱 26 double Beverage::cost() 27 { 28 double sum0 = 0; 29 if(HasMilk()) 30 { 31 sum0 += m_dCostMilk; 32 } 33 34 if (HasSugar()) 35 { 36 sum0 += m_dCostSugar; 37 } 38 return sum0; 39 }
//DarkRoastCoffee.h #pragma once #include "Beverage.h" class DarkRoastCoffee : public Beverage { public: DarkRoastCoffee(double myCost,bool bMilk, bool bSugar, double dCostMilk, double dCostSugar); ~DarkRoastCoffee(); double cost(); char * Description(); double GetMyCost(); private: double m_dMyCost; };
1 //DarkRoastCoffee.cpp 2 #include "DarkRoastCoffee.h" 3 4 //在子类的构造函数中,调用父类的有参构造函数. 注意初始化成员列表需要放在函数定义中,因为最后的")"后面要跟着"{" 5 DarkRoastCoffee::DarkRoastCoffee(double myCost,bool bMilk, bool bSugar, double dCostMilk, double dCostSugar):Beverage(bMilk, bSugar, dCostMilk, dCostSugar), m_dMyCost(myCost) 6 { 7 cout << "DarkRoastCoffee Begins~" << endl; 8 } 9 10 double DarkRoastCoffee::GetMyCost() 11 { 12 return m_dMyCost; 13 } 14 15 DarkRoastCoffee::~DarkRoastCoffee() 16 { 17 cout << "DarkRoastCoffee is Over~" << endl; 18 } 19 20 double DarkRoastCoffee::cost() 21 { 22 return Beverage::cost() + GetMyCost();
//注意此时用了父类::方法,这里的Beverage::cost()不必是static,因为在该方法执行时父类对象已经创建了(若是在无继承关系的别的类中,cost必须要是static了) //当然这里Beverage::cost()也不能是static,因为static函数不能为virtual. 24 }
输出结果:
1 //CoffeeCost.cpp 2 3 #include "Beverage.h" 4 #include "DarkRoastCoffee.h" 5 6 int main() 7 { 8 DarkRoastCoffee dc(10, false, true, 2, 4); 9 cout << dc.cost() << endl; 10 return 0; 11 }