C++常用23种设计模式总结(三)------装饰模式

往期回顾
C++常用23种设计模式总结(一)------单例模式
C++常用23种设计模式总结(二)------观察者模式

什么是装饰模式

装饰模式是一种结构型设计模式,它允许你在运行时为对象动态添加新的行为。该模式通过将对象放入包装器中来实现这一点,这个包装器会实现与被包装对象相同的接口,并且会将所有方法的调用委派给被包装对象。同时,包装器还可以定义一些额外的行为,例如添加新的方法或修改现有方法的行为。
装饰模式的主要优点是它允许你在不修改现有代码的情况下扩展对象的功能。这使得代码更加灵活和可维护,因为你可以通过添加新的装饰器来实现新的功能,而不必修改现有的代码。此外,装饰模式还遵循开闭原则,因为它允许你在不修改现有代码的情况下添加新的功能。
然而,装饰模式也有一些缺点。首先,由于每个装饰器都需要实现与被包装对象相同的接口,因此可能会导致类的数量增加。此外,由于装饰器可以嵌套,因此可能会导致代码变得复杂和难以理解。最后,装饰模式可能会导致性能下降,因为每个方法调用都需要经过多个装饰器的处理。

参考代码

cpp 复制代码
#include <iostream>

// 抽象组件
class Component {
public:
    virtual void operation() = 0;
};

// 具体组件
class ConcreteComponent : public Component {
public:
    void operation() override {
        std::cout << "具体组件的操作" << std::endl;
    }
};

// 抽象装饰器
class Decorator : public Component {
public:
    Decorator(Component* comp) : component(comp) {}
    void operation() override {
        if (component != nullptr) {
            component->operation();
        }
    }
protected:
    Component* component;
};

/*续写*/


// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(Component* comp) : Decorator(comp) {}
    void operation() override {
        Decorator::operation();
        std::cout << "具体装饰器A的操作" << std::endl;
    }
};

// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:
    ConcreteDecoratorB(Component* comp) : Decorator(comp) {}
    void operation() override {
        Decorator::operation();
        std::cout << "具体装饰器B的操作" << std::endl;
    }
};

int main() {
    Component* component = new ConcreteComponent();
    Component* decoratorA = new ConcreteDecoratorA(component);
    Component* decoratorB = new ConcreteDecoratorB(decoratorA);

    decoratorB->operation();

    delete decoratorB;
    delete decoratorA;
    delete component;

    return 0;
}

运行结果

bash 复制代码
具体组件的操作
具体装饰器A的操作
具体装饰器B的操作
相关推荐
2501_944521593 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理3 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
青瓦梦滋3 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
wangchunyu1145 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
程序 代码狂人6 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
meiying88387 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
@大迁世界8 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
SEO_juper8 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
学逆向的8 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
低调滴开发8 小时前
3 行代码写崩一个函数?切片才是 Rust 字符串处理的正确姿势
开发语言·后端·rust