Design Patterns 9: Decorator
动态加载、拓展功能
struct Component
{
virtual void Operation() = 0;
};
struct ConcreteComponent : Component
{
void Operation() override {}
};
struct Decorator : Component
{
Decorator(Component* component) : _component(component) {};
void Operation() override { _component->Operation(); }
private:
Component* _component;
};
struct ConcreteDecoratorA : Decorator
{
ConcreteDecoratorA(Component* component) : Decorator(component) {}
void OperationA() {}
void Operation() override
{
OperationA();
Decorator::Operation();
}
};
struct ConcreteDecoratorB : Decorator
{
ConcreteDecoratorB(Component* component) : Decorator(component) {}
void OperationB() {}
void Operation() override
{
Decorator::Operation();
OperationB();
}
};
int main()
{
Component* component = new ConcreteComponent;
Component* decoratorA = new ConcreteDecoratorA(component);
//ConcreteDecoratorA::OperationA() then ConcreteComponent::Operation() get called
decoratorA->Operation();
Component* decoratorB = new ConcreteDecoratorB(component);
//ConcreteComponent::Operation() then ConcreteDecoratorB::OperationB() get called
decoratorB->Operation();
}