Design Patterns 9: Decorator

动态加载、拓展功能

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();
}