23种设计模式 - 装饰器模式

模式定义

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许动态地为对象添加新功能,而无需修改其结构。它通过将对象包装在装饰器类的实例中,实现功能的灵活扩展,符合开放/封闭原则。


模式结构

抽象组件(Component):定义核心功能的接口(如数控系统的数据采集接口)。

具体组件(ConcreteComponent):实现基础功能(如基础传感器数据采集)。

抽象装饰器(Decorator):继承自Component,并持有其引用,用于扩展功能。

具体装饰器(ConcreteDecorator):实现具体的扩展功能(如日志记录、数据校验)。


适用场景

动态扩展对象功能,避免继承导致的类爆炸(如数控系统中逐步添加日志、校验等模块)。

需要透明地增强对象功能,且不影响原有代码。


C++示例(数控系统场景)

场景说明:

数控系统需要动态扩展数据采集功能,例如在基础采集功能上添加日志记录和数据校验。

cpp 复制代码
#include 
#include 

// 抽象组件:数据采集接口
class DataCollector {
public:
    virtual ~DataCollector() = default;
    virtual std::string collectData() = 0;
};

// 具体组件:基础传感器数据采集
class SensorCollector : public DataCollector {
public:
    std::string collectData() override {
        return "传感器数据: 温度=75°C, 压力=100kPa";
    }
};

// 抽象装饰器
class DataCollectorDecorator : public DataCollector {
protected:
    std::unique_ptr collector;  // 持有组件对象
public:
    DataCollectorDecorator(std::unique_ptr c) : collector(std::move(c)) {}
    std::string collectData() override {
        return collector->collectData();
    }
};

// 具体装饰器1:添加日志记录
class LoggingDecorator : public DataCollectorDecorator {
public:
    using DataCollectorDecorator::DataCollectorDecorator;
    std::string collectData() override {
        std::string data = collector->collectData();
        std::cout << "[日志] 采集数据: " << data << std::endl;
        return data;
    }
};

// 具体装饰器2:添加数据校验
class ValidationDecorator : public DataCollectorDecorator {
public:
    using DataCollectorDecorator::DataCollectorDecorator;
    std::string collectData() override {
        std::string data = collector->collectData();
        if (data.empty()) throw std::runtime_error("数据校验失败: 空数据");
        return "[校验通过] " + data;
    }
};

// 客户端(数控系统)
int main() {
    // 基础采集功能
    auto baseCollector = std::make_unique();
    
    // 动态添加日志和校验功能
    auto decoratedCollector = std::make_unique(
        std::make_unique(std::move(baseCollector))
    );

    // 使用装饰后的采集器
    std::cout << decoratedCollector->collectData() << std::endl;
    return 0;
}

代码说明

抽象组件:DataCollector定义了数据采集接口collectData()

具体组件:SensorCollector实现基础数据采集逻辑。

抽象装饰器:DataCollectorDecorator继承组件接口并持有其对象,为扩展功能提供基础。

具体装饰器:

  • LoggingDecorator在采集后添加日志记录。
  • ValidationDecorator对数据进行校验。

输出结果:

复制代码
[日志] 采集数据: 传感器数据: 温度=75°C, 压力=100kPa  
[校验通过] 传感器数据: 温度=75°C, 压力=100kPa

优势与扩展性

灵活扩展:可自由组合装饰器(如先记录日志再校验),无需修改原有类。

符合开闭原则:新增功能通过装饰器实现,避免修改已有代码。

数控系统应用:可扩展更多装饰器(如数据加密、格式转换),满足复杂需求。

相关推荐
神仙别闹4 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
hansang_IR6 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
落羽的落羽7 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生7 小时前
Linux-进程控制
linux·运维·服务器·c++
刃神太酷啦7 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
喜欢吃燃面10 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe10 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
ShineWinsu11 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸11 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图12 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++