装饰者模式
- 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承者更有弹性的替代方案。 装饰者模式通常配合工厂模式使用
- 运行时扩展远比编译时期的继承更好,利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然后,如果呢个够利用组合的做法扩展对象的行为,就可以在运行时动态进行扩展。
- 装饰者和被装饰者有相同的顶层父类,需要变化的部分在父类中隔离出来,装饰者和被装饰者进行不同的实现。
- 装饰者模式,可以用一个或多个装饰者嵌套包装一个对象(被装饰者) 装饰者下例中是饮料中加的东西,被装饰的对象是饮料。装饰者可以动态扩展。
- 装饰者模式就是增加一系列行为到被包装对象上,每一个行为/对象相当于一个装饰
- 装饰者模式体现是设计原则:
- 开放-关闭原则:类应该对扩展开放,对修改关闭 (遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。应用于代码中最可能改变的地方。)
例子
class Bevarage{
public:
Bevarage(){}
~Bevarage(){}
virtual double cost()=0;
virtual string getDescription()=0;
int getsize(){
return size;
}
protected:
string description="Unknown Beverage";
int size=10;
};
class Espresso:public Bevarage{
public:
Espresso(){
description="This is Espresso";
}
virtual string getDescription(){
return description;
};
virtual double cost(){
return 1.99;
}
};
class HouseBlend:public Bevarage{
public:
HouseBlend(){
description="This is HouseBlend";
}
virtual string getDescription(){
return description;
};
virtual double cost(){
return 0.89;
}
};
class CondimentDecorator : public Bevarage{
public:
virtual string getDescription()=0;
};
class Mocha : public CondimentDecorator{
private:
Bevarage* bevarage;
public:
Mocha(Bevarage* m_bevarage):bevarage(m_bevarage){}
virtual string getDescription(){
return bevarage->getDescription()+","+"Mocha";
}
double cost(){
return bevarage->cost()+1;
}
};
class Whip: public CondimentDecorator{
private:
Bevarage* bevarage;
public:
Whip(Bevarage* m_bevarage):bevarage(m_bevarage){}
virtual string getDescription(){
return bevarage->getDescription()+","+"Whip";
}
double cost(){
return bevarage->cost()+2;
}
};
int main(){
//Espresso1.99 HouseBlend0.89 Mocha1 Whip2
Espresso* espresso = new Espresso;
Whip* _whip=new Whip(espresso);
_whip=new Whip(_whip);
cout<<_whip->getDescription()<<" costs="<<_whip->cost();
system("pause");
return 0;
}