// test03.cpp : Defines the entry point for the console application.
////设计模式第3章 装饰者模式#include "stdafx.h"#include <string>#include <iostream>//#include <cstring>using namespace std;class Beverage{ public: string description /*= "Unkown Beverage"*/;//只有静态整型常量数据成员能在类中初始化public: virtual string getDescription()//必须为虚函数 { return description; } virtual double cost(){return 0;} ;//必须为虚函数};class CondimentDecorator : public Beverage{ virtual string getDescription(){return NULL;} ;};class Espresso : public Beverage{ public: Espresso() { description = "Espresso"; } double cost(){ return 1.99; }};class HouseBlend : public Beverage{ public: HouseBlend() { description = "House Blend Coffee"; } double cost() { return .89; }};class DarkRoast : public Beverage{ public: DarkRoast() { description = "Dark Roast Coffee"; } double cost() { return .99; }};class Mocha : public CondimentDecorator{ Beverage* beverage;public: Mocha(Beverage* beverage)//必须为指针 { this->beverage = beverage; } string getDescription() { return beverage->getDescription() + ", Mocha"; } double cost() { return .20 + beverage->cost(); }};class Whip : public CondimentDecorator{ Beverage* beverage;public: Whip(Beverage* beverage) { this->beverage = beverage; } string getDescription() { return beverage->getDescription() + ", Whip"; } double cost() { return .10 + beverage->cost(); }};class Soy : public CondimentDecorator{ Beverage* beverage;public: Soy(Beverage* beverage) { this->beverage = beverage; } string getDescription() { return beverage->getDescription() + ", Soy"; } double cost() { return .15 + beverage->cost(); }};int _tmain(int argc, _TCHAR* argv[]){ Beverage* beverage = new Espresso(); cout<<beverage->getDescription() << " $ " << beverage->cost()<<endl; Beverage* beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2);//必须传递指针 beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); //printf("%s %$ %f",beverage2->getDescription(),beverage2->cost());//printf 不能输出string类型 cout<<beverage2->getDescription()<<" $ "<<beverage2->cost()<<endl; Beverage* beverage3 = new HouseBlend(); beverage3 = new Soy(beverage3); beverage3 = new Mocha(beverage3); beverage3 = new Whip(beverage3); //printf("%s %$ %f",beverage3->getDescription(),beverage3->cost()); cout<<beverage3->getDescription()<<" $ "<<beverage3->cost()<<endl; return 0;}