目录
1.意图
动态地给一个对象加入额外的方法/行为。
装饰者为它的子类提供了灵活的扩展方法/函数的行为。
2.UML类图
3.代码实现
#include<iostream>
#include<string>
using namespace std;
//we are going to decorate a house
class House
{
public:
virtual void draw() = 0;
virtual string getDescription() = 0;
virtual ~House() {}
};
class SimpleHouse: public House
{
public:
void draw() {}
string getDescription() {
return "simple house\n";
}
};
class HouseDecorator: public House
{
protected:
House *decoratedHouse;
public:
HouseDecorator(House *hs):decoratedHouse(hs){}
};
//Indoor
class IndoorDecorator:public HouseDecorator
{
public:
IndoorDecorator(House *hs):HouseDecorator(hs) {}
void draw() {
drawIndoor();
decoratedHouse->draw();
}
string getDescription() {
return decoratedHouse->getDescription() + "with Indoor\n";
}
private:
void drawIndoor(){ }
};
//Outdoor
class OutdoorDecorator: public HouseDecorator
{
public:
OutdoorDecorator(House *hs):HouseDecorator(hs) { }
void draw() {
drawOutdoor();
decoratedHouse->draw();
}
string getDescription() {
return decoratedHouse->getDescription() + "with Outdoor\n";
}
private:
void drawOutdoor() {}
};
int main()
{
House *hs=new SimpleHouse();
std::cout<<hs->getDescription()<<std::endl;
House *in = new IndoorDecorator(new SimpleHouse());
std::cout<<in->getDescription()<<std::endl;
House *out = new OutdoorDecorator(new SimpleHouse());
std::cout<<out->getDescription()<<std::endl;
House *decoratedHouse = new IndoorDecorator(
new OutdoorDecorator(new SimpleHouse()));
std::cout<<decoratedHouse->getDescription()<<std::endl;
return 0;
}
运行结果:
simple house
simple house
with Indoor
simple house
with Outdoor
simple house
with Outdoor
with Indoor
分析:
每一个component(House) 可以被它own或者wrapped装饰者使用。
ConcreteComponent(SimpleHouse)就是我们即将对其动态地增加方法(Outdoor/Indoor)的对象,继承自House。
每一个装饰者has-a(wraps) 一个componet,这意味着装饰者拥有一个指向House对象的指针(decoratedHouse成员)。