结构型模式4-装饰模式
装饰模式Decorator
意图
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式想比生成子类更为灵活。
问题思考
比如,我们想给image上盖一层半透明的背景,再在中央添加几个文字。我们可以这样子类化image,TransparentImage, TextTransparentImage。但如果我们又需要另外一种组合呢:image中央添加几个文字,再盖上一层半透明背景。我们可以也可以之内化,TextImage,TransparentTextImage。这造成了大量的重复。因为就功能来说,这两种功能完全一致,只是顺序不同。
适用性
- 在不影响其他对象的情况下, 以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤销的职责
- 当生成子类不合适的时候。比如:为支持所有的可能,子类的数目可能暴增。
注意事项
- 我们可以递归地为对象添加多个Decorator
类图
decorator实现
class Component {
public:
virtual void Operation() = 0;
};
class Decorator : public Component {
public:
explicit Decorator(Component *c) { mComponent = c; }
void Operation() override {
mComponent->Operation();
}
private:
Component *mComponent = nullptr;
};
class ConcreteComponent : public Component {
public:
void Operation() override {
// some code
}
};
class ConcreteDecoratorA : public Decorator {
public:
explicit ConcreteDecoratorA(Component *c) : Decorator(c) {}
void AddedBehavior() {
// some code
}
void Operation() override {
AddedBehavior();
Decorator::Operation();
}
};
网友评论