设计模式学习---装饰者

来源:互联网 发布:mac 虚拟机 win10 4g 编辑:程序博客网 时间:2024/06/14 00:18

UML图


基类:CDrink

#pragma once#include <string>class CDrink{public:CDrink(void){};virtual void getDrinkName()=0;virtual double getDrinkPrice()=0;virtual ~CDrink(void){};};

Tea.h

#pragma once#include "drink.h"#include <string>#include <iostream>using namespace std;class CTea :public CDrink{public:void getDrinkName();double getDrinkPrice();CTea(void);~CTea(void);};
Tea.cpp

#include "Tea.h"CTea::CTea(void){}void CTea::getDrinkName(){cout<<"茶";}double CTea::getDrinkPrice(){double teaPrice = 8;return teaPrice;}CTea::~CTea(void){}


Coffee.h
#pragma once#include "drink.h"#include <string>#include <iostream>using namespace std;class CCoffee :public CDrink{public: void getDrinkName(); double getDrinkPrice(); CCoffee(std::string drinkName);~CCoffee(void);std::string mDrinkName;};
Coffee.cpp

#include "Coffee.h"CCoffee::CCoffee(std::string drinkName):mDrinkName(drinkName){}void CCoffee::getDrinkName(){cout<<mDrinkName<<"咖啡";}double CCoffee::getDrinkPrice(){double coffeePrice = 10.0;return coffeePrice;}CCoffee::~CCoffee(void){}

DrinkDecorate.h

#pragma once#include "drink.h"#include <iostream>using namespace std;class CDrinkDecorate :public CDrink{public:CDrinkDecorate(CDrink *drink);~CDrinkDecorate(void);virtual void getDrinkName();virtual double getDrinkPrice();protected:CDrink *mDrink;};

DrinkDecorate.cpp

#include "DrinkDecorate.h"CDrinkDecorate::CDrinkDecorate(CDrink *drink):mDrink(drink){}void CDrinkDecorate::getDrinkName(){}double CDrinkDecorate::getDrinkPrice(){return 0;}CDrinkDecorate::~CDrinkDecorate(void){}

DrinkDecorateMilk.h

#pragma once#include "drinkdecorate.h"#include <iostream>#include <string>using namespace std;class CDrinkDecorateMilk :public CDrinkDecorate{public:CDrinkDecorateMilk(CDrink *drink);~CDrinkDecorateMilk(void);void getDrinkName();double getDrinkPrice();};


DrinkDecorateMilk.cpp

#include "DrinkDecorateMilk.h"CDrinkDecorateMilk::CDrinkDecorateMilk(CDrink *drink):CDrinkDecorate(drink){}void CDrinkDecorateMilk::getDrinkName(){if (mDrink){mDrink->getDrinkName();}cout<<"加牛奶";}double CDrinkDecorateMilk::getDrinkPrice(){double total = 6.0;if (mDrink){total += mDrink->getDrinkPrice();}return total;}CDrinkDecorateMilk::~CDrinkDecorateMilk(void){}

DrinkDecorateSuger.h

#pragma once#include "drinkdecorate.h"#include <string>using namespace std;class CDrinkDecorateSuger :public CDrinkDecorate{public:CDrinkDecorateSuger(CDrink *drink);~CDrinkDecorateSuger(void);void getDrinkName();double getDrinkPrice();};

DrinkDecorateSuger.cpp

#include "DrinkDecorateSuger.h"CDrinkDecorateSuger::CDrinkDecorateSuger(CDrink *drink):CDrinkDecorate(drink){}void CDrinkDecorateSuger::getDrinkName(){if (mDrink){mDrink->getDrinkName();}cout<<"加糖";}double CDrinkDecorateSuger::getDrinkPrice(){double total = 4;if (mDrink){total += mDrink->getDrinkPrice();}return total;}CDrinkDecorateSuger::~CDrinkDecorateSuger(void){}

main.cpp

#include "Drink.h"#include "Coffee.h"#include "Tea.h"#include "DrinkDecorate.h"#include "DrinkDecorateMilk.h"#include "DrinkDecorateSuger.h"int main(){CDrink * drink = new CCoffee("摩卡");CDrink * coffee = new CDrinkDecorateMilk(drink);CDrink * ddcoffee = new CDrinkDecorateSuger(coffee);CDrink * nCoffee = new CDrinkDecorateSuger(ddcoffee);nCoffee->getDrinkName();cout<<"费用总计:"<<nCoffee->getDrinkPrice()<<endl;delete nCoffee;delete ddcoffee;delete coffee;delete drink;getchar();}




0 0
原创粉丝点击