设计模式--装饰(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的操作

通过装饰器模式,可以灵活地组合多个装饰器对象,以实现不同的功能扩展。每个装饰器对象都可以独立地添加额外的功能,而不影响其他装饰器或组件对象的功能。这使得装饰器模式成为一种非常强大且灵活的设计模式。

posted @   guanyubo  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示