装饰者模式:动态的讲责任附加到对象。若要扩展功能,装饰者提供了比继承更有弹性的替代方案;
关键:装饰者和被装饰着必须是一样的类型,即有共同的超类;利用继承达到类型匹配,而不是获得行为;
原则:对扩展开放,对修改关闭;
缺点:装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂;
书中类图框架:
装饰方式:
部分代码:
//装饰者模式
#include <iostream>
using namespace std;
#include <string>
class Beverage{
string description;
public:
Beverage():description("Unknown Beverage"){};
void set_decrp( const string& str ){
description = str;
}
virtual string getdescription(){
return description;
}
virtual double cost(){
return 0.0;
}
};
class Espresso:public Beverage{
public:
Espresso(){
set_decrp( "Espresso");
}
double cost(){
return 1.99;
}
};
class HouseBlend:public Beverage{
public:
HouseBlend(){
set_decrp( "House Blend Coffee");
}
double cost(){
return 0.89;
}
};
class CondimentDecrator:public Beverage{
public:
virtual string getdescription(){
return Beverage::getdescription();
}
};
class Mocha:public CondimentDecrator{
Beverage *beverage;
public:
Mocha(Beverage *beverage){
this->beverage = beverage;
}
string getdescription(){
return beverage->getdescription() + " , Mocha";
}
double cost(){
return 0.20 + beverage->cost();
}
};
class Soy:public CondimentDecrator{
Beverage *beverage;
public:
Soy(Beverage *beverage){
this->beverage = beverage;
}
string getdescription(){
return beverage->getdescription() + " , Soy";
}
double cost(){
return 0.15 + beverage->cost();
}
};
class Whip:public CondimentDecrator{
Beverage *beverage;
public:
Whip(Beverage *beverage){
this->beverage = beverage;
}
string getdescription(){
return beverage->getdescription() + " , Whip";
}
double cost(){
return 0.10 + beverage->cost();
}
};
void test()
{
Beverage *beverage = new Espresso();
beverage = new Mocha( beverage );
beverage = new Mocha( beverage );
beverage = new Whip( beverage );
cout<<beverage->getdescription()<<" $"<<beverage->cost()<<endl;
}
int main()
{
<span style="white-space:pre"> </span>test();
<span style="white-space:pre"> </span>return 0;
}
/*
*/