设计模式--装饰(Decorator)模式
概念
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许动态地给一个对象添加一些额外的职责,而不需要改变其结构。装饰器模式提供了一种灵活的方式来扩展对象的功能,同时保持对象的接口一致。

示例
在C++中,装饰器模式通常通过继承和接口实现。下面是一个简单的示例来说明C++中的装饰器模式:
首先,定义一个接口(抽象组件),它定义了对象应该具备的基本功能:
class Component {
public:
    virtual void Operation() = 0; // 纯虚函数,定义基本功能
};
然后,创建一个具体的组件类,它实现了接口并提供了实际的功能:
class ConcreteComponent : public Component {
public:
    void Operation() override{
        std::cout << "具体的操作对象" << std::endl;
    }
};
接下来,创建一个装饰器类,它继承自组件接口,并持有一个指向组件对象的指针。装饰器类通过在其操作方法中调用组件对象的方法,并在调用前后添加额外的功能,从而实现对组件的装饰:
class Decorator : public Component{
public:
    Component* component;
public:
    void SetComponent(Component* component) {
        this->component = component;
    }
    void Operation() override{
        if (nullptr != this->component) {
            this->component->Operation();
        }
    }
};
最后,可以创建具体的装饰器类,它们继承自装饰器类,并根据需要添加特定的额外功能:
class ConcreteDecoratorA : public Decorator {
public:
    std::string addState;
public:
    void Operation() override {
        Decorator::Operation();
        addState = "New State";
        std::cout << "具体装饰对象A的操作" << std::endl;
    }
};
class ConcreteDecoratorB : public Decorator {
public:
    void Operation() override {
        Decorator::Operation();
        AddedBehavior();
        std::cout << "具体装饰对象B的操作" << std::endl;
    }
private:
    void AddedBehavior() {}
};
使用装饰器模式时,可以根据需要动态地创建装饰器对象,并将它们应用于组件对象上。例如:
int main() {
    Component* component = new ConcreteComponent(); // 创建组件对象
    Decorator* decoratorA = new ConcreteDecoratorA(component); // 创建装饰器A对象,并将其应用于组件对象
    Decorator* decoratorB = new ConcreteDecoratorB(decoratorA); // 创建装饰器B对象,并将其应用于装饰器A对象
    decoratorB->Operation(); // 执行操作,将依次调用装饰器B、装饰器A和组件对象的方法
    delete decoratorB;
    delete decoratorA;
    delete component;
    return 0;
}
int main() {
    ConcreteComponent* c = new ConcreteComponent();     // 创建组件对象
    ConcreteDecoratorA* d1 = new ConcreteDecoratorA();  // 创建装饰器A对象
    ConcreteDecoratorB* d2 = new ConcreteDecoratorB();  // 创建装饰器B对象
    d1->SetComponent(c);    // 装饰器A对象应用于组件对象
    d2->SetComponent(d1);   // 装饰器B对象应用于装饰器A对象
    d2->Operation();        // 执行操作,将依次调用组件对象的方法、装饰器A、装饰器B
    
    return 0;
}
输出结果:
具体的操作对象
具体装饰对象A的操作
具体装饰对象B的操作
通过装饰器模式,可以灵活地组合多个装饰器对象,以实现不同的功能扩展。每个装饰器对象都可以独立地添加额外的功能,而不影响其他装饰器或组件对象的功能。这使得装饰器模式成为一种非常强大且灵活的设计模式。
    Do not communicate by sharing memory; instead, share memory by communicating.

                
            
        
浙公网安备 33010602011771号