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

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();
}




猜你喜欢

转载自blog.csdn.net/zxycele/article/details/51910392
今日推荐