装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
基本模型:
利用基本组件和装饰物共同继承自一个超类的设计,在超类中拥有所需的方法接口,在所有的装饰物类中保存超类的指针,将此指针视为此装饰物装饰之前的状态,基于此实现此装饰物装饰后的状态,所有的装饰物都有之前和之后的状态,也即只完成属于自己的那个步骤,因此符合开放关闭原则。核心就是利用多态来保存各个步骤的属性,而形式完全一致。
一个例子:
#include<iostream>
#include<string>
using namespace std;
class Beverage
{
public:
virtual void getDescription() = 0;
virtual float cost() = 0;
};
class HouseBlend :public Beverage
{
public :
void getDescription()override{ cout << "HouseBlend ----- $" << cost()<<endl; }
float cost()override{ return 2.1; }
};
class DarkRoast :public Beverage
{
public:
void getDescription()override{ cout << "DarkRoast ----- $" << cost() << endl; }
float cost()override{ return 3.0f; }
};
class Espresso :public Beverage
{
public:
void getDescription()override{ cout << "Espresso ----- $" << cost() << endl; }
float cost()override{ return 2.3f; }
};
class Decaf :public Beverage
{
public:
void getDescription() override{ cout << "Decaf ----- $" << cost() << endl; }
float cost() override{ return 3.1f; }
};
class CondimentDecorator :public Beverage
{
public:
Beverage *_beverage;
};
class Milk :public CondimentDecorator
{
public:
Milk(Beverage *beverage){ _beverage = beverage; };
void getDescription() override { _beverage->getDescription(); cout << "Milk ----- $0.8" << endl; }
float cost() override{ return 0.8f+_beverage->cost(); }
};
class Mocha :public CondimentDecorator
{
public:
Mocha(Beverage *beverage){ _beverage = beverage; }
void getDescription() override { _beverage->getDescription(); cout << "Mocha ----- $0.6" << endl; }
float cost() override { return 0.6f + _beverage->cost(); }
};
class Soy :public CondimentDecorator
{
public:
Soy(Beverage *beverage){ _beverage = beverage; }
void getDescription() override { _beverage->getDescription(); cout << "Soy ----- $0.4" << endl; }
float cost() override { return 0.4f + _beverage->cost(); }
};
class Whip :public CondimentDecorator
{
public:
Whip(Beverage *beverage){ _beverage = beverage; }
void getDescription() override { _beverage->getDescription(); cout << "Whip ----- $0.3" << endl; }
float cost() override{ return 0.3f + _beverage->cost(); }
};
int main()
{
Beverage *beverage =new DarkRoast();
beverage =new Milk(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
beverage->getDescription();
cout<<"Total : $"<<beverage->cost()<<endl;
Beverage *beverage1 = new Decaf();
beverage1 = new Soy(beverage1);
beverage1 = new Mocha(beverage1);
beverage1 = new Mocha(beverage1);
beverage1 = new Milk(beverage1);
beverage1->getDescription();
cout << "Total : $"<<beverage1->cost() << endl;
system("pause");
return 0;
}
结果: