C++中的装饰器模式

59 篇文章 0 订阅
52 篇文章 1 订阅

目录

装饰器模式(Decorator Pattern)

实际应用

图形对象装饰器

数据流装饰器

网络请求装饰器

总结


装饰器模式(Decorator Pattern)

装饰器模式是一种结构型设计模式,它允许你动态地向一个对象添加新的行为,而不改变其接口。这种模式通过将对象放入包含行为的特殊封装对象(装饰器)中来实现。装饰器模式提供了一种灵活的替代继承的方式来扩展对象的功能。

实际应用

图形对象装饰器

假设有一个图形对象,可能需要动态地添加边框、颜色等装饰。

#include <iostream>
#include <memory>

// 图形接口
class Shape {
public:
    virtual ~Shape() = default;
    virtual void draw() const = 0;
};

// 具体实现:圆形
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing Circle\n";
    }
};

// 具体实现:矩形
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing Rectangle\n";
    }
};

// 装饰器基类
class ShapeDecorator : public Shape {
protected:
    std::shared_ptr<Shape> decoratedShape;
public:
    ShapeDecorator(std::shared_ptr<Shape> shape) : decoratedShape(shape) {}
    virtual void draw() const override {
        decoratedShape->draw();
    }
};

// 具体装饰器:添加红色边框
class RedBorderDecorator : public ShapeDecorator {
public:
    RedBorderDecorator(std::shared_ptr<Shape> shape) : ShapeDecorator(shape) {}

    void draw() const override {
        decoratedShape->draw();
        setRedBorder();
    }

    void setRedBorder() const {
        std::cout << "Adding Red Border\n";
    }
};

// 具体装饰器:添加蓝色背景
class BlueBackgroundDecorator : public ShapeDecorator {
public:
    BlueBackgroundDecorator(std::shared_ptr<Shape> shape) : ShapeDecorator(shape) {}

    void draw() const override {
        decoratedShape->draw();
        setBlueBackground();
    }

    void setBlueBackground() const {
        std::cout << "Adding Blue Background\n";
    }
};

int main() {
    std::shared_ptr<Shape> circle = std::make_shared<Circle>();
    std::shared_ptr<Shape> redCircle = std::make_shared<RedBorderDecorator>(circle);
    std::shared_ptr<Shape> blueRedCircle = std::make_shared<BlueBackgroundDecorator>(redCircle);

    std::cout << "Circle with normal border:\n";
    circle->draw();

    std::cout << "\nCircle with red border:\n";
    redCircle->draw();

    std::cout << "\nCircle with red border and blue background:\n";
    blueRedCircle->draw();

    return 0;
}

数据流装饰器

假设有一个数据流,可以动态地向数据流添加不同的处理,如加密、压缩等。

#include <iostream>
#include <memory>
#include <string>

// 数据流接口
class DataStream {
public:
    virtual ~DataStream() = default;
    virtual void write(const std::string& data) = 0;
};

// 具体实现:文件数据流
class FileDataStream : public DataStream {
public:
    void write(const std::string& data) override {
        std::cout << "Writing data to file: " << data << "\n";
    }
};

// 装饰器基类
class DataStreamDecorator : public DataStream {
protected:
    std::shared_ptr<DataStream> wrappee;
public:
    DataStreamDecorator(std::shared_ptr<DataStream> stream) : wrappee(stream) {}

    void write(const std::string& data) override {
        wrappee->write(data);
    }
};

// 具体装饰器:加密数据流
class EncryptedDataStream : public DataStreamDecorator {
public:
    EncryptedDataStream(std::shared_ptr<DataStream> stream) : DataStreamDecorator(stream) {}

    void write(const std::string& data) override {
        std::string encryptedData = encrypt(data);
        DataStreamDecorator::write(encryptedData);
    }

    std::string encrypt(const std::string& data) {
        return "Encrypted(" + data + ")";
    }
};

// 具体装饰器:压缩数据流
class CompressedDataStream : public DataStreamDecorator {
public:
    CompressedDataStream(std::shared_ptr<DataStream> stream) : DataStreamDecorator(stream) {}

    void write(const std::string& data) override {
        std::string compressedData = compress(data);
        DataStreamDecorator::write(compressedData);
    }

    std::string compress(const std::string& data) {
        return "Compressed(" + data + ")";
    }
};

int main() {
    std::shared_ptr<DataStream> fileStream = std::make_shared<FileDataStream>();
    std::shared_ptr<DataStream> encryptedStream = std::make_shared<EncryptedDataStream>(fileStream);
    std::shared_ptr<DataStream> compressedEncryptedStream = std::make_shared<CompressedDataStream>(encryptedStream);

    std::cout << "Writing plain data to file:\n";
    fileStream->write("Hello World");

    std::cout << "\nWriting encrypted data to file:\n";
    encryptedStream->write("Hello World");

    std::cout << "\nWriting compressed and encrypted data to file:\n";
    compressedEncryptedStream->write("Hello World");

    return 0;
}

网络请求装饰器

假设有一个网络请求对象,可以动态地添加日志记录、重试等功能。

#include <iostream>
#include <memory>
#include <string>

// 网络请求接口
class NetworkRequest {
public:
    virtual ~NetworkRequest() = default;
    virtual void execute() const = 0;
};

// 具体实现:基础网络请求
class BasicNetworkRequest : public NetworkRequest {
public:
    void execute() const override {
        std::cout << "Executing basic network request\n";
    }
};

// 装饰器基类
class NetworkRequestDecorator : public NetworkRequest {
protected:
    std::shared_ptr<NetworkRequest> wrappee;
public:
    NetworkRequestDecorator(std::shared_ptr<NetworkRequest> request) : wrappee(request) {}

    void execute() const override {
        wrappee->execute();
    }
};

// 具体装饰器:日志记录
class LoggingNetworkRequest : public NetworkRequestDecorator {
public:
    LoggingNetworkRequest(std::shared_ptr<NetworkRequest> request) : NetworkRequestDecorator(request) {}

    void execute() const override {
        log();
        NetworkRequestDecorator::execute();
    }

    void log() const {
        std::cout << "Logging network request\n";
    }
};

// 具体装饰器:重试机制
class RetryNetworkRequest : public NetworkRequestDecorator {
private:
    int retries;
public:
    RetryNetworkRequest(std::shared_ptr<NetworkRequest> request, int retries) : NetworkRequestDecorator(request), retries(retries) {}

    void execute() const override {
        for (int i = 0; i < retries; ++i) {
            try {
                NetworkRequestDecorator::execute();
                return;
            } catch (...) {
                std::cout << "Retry " << i + 1 << " failed\n";
            }
        }
        std::cout << "All retries failed\n";
    }
};

int main() {
    std::shared_ptr<NetworkRequest> basicRequest = std::make_shared<BasicNetworkRequest>();
    std::shared_ptr<NetworkRequest> loggedRequest = std::make_shared<LoggingNetworkRequest>(basicRequest);
    std::shared_ptr<NetworkRequest> retriedLoggedRequest = std::make_shared<RetryNetworkRequest>(loggedRequest, 3);

    std::cout << "Executing basic request:\n";
    basicRequest->execute();

    std::cout << "\nExecuting logged request:\n";
    loggedRequest->execute();

    std::cout << "\nExecuting retried and logged request:\n";
    retriedLoggedRequest->execute();

    return 0;
}

总结

装饰器模式可以使对象在运行时动态地添加新的行为而不改变其接口。这使得我们可以灵活地扩展对象的功能,而不需要修改已有的代码。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式通过创建一个装饰类来包装原始的类,从而实现动态地扩展一个对象的功能。装饰类和被装饰类可以独立发展,它们之间没有耦合关系。装饰器模式是继承的一个替代模式,它避免了使用继承来扩展对象功能所带来的静态特性。 在C++,可以通过使用抽象类和具体类来实现装饰器模式。首先创建一个抽象类(比如Shape)作为基类,然后创建具体的类(比如Circle和Rectangle)作为子类。这些子类实现了抽象类的纯虚函数(比如draw),分别表示不同的图形。 在使用装饰器模式时,我们可以创建一个装饰类,它也是抽象类的子类,并且它的对象包含一个抽象类对象的指针。装饰类可以在原始对象的基础上添加额外的功能,同时保持原始对象的接口不变。通过使用装饰器模式,我们可以动态地扩展一个对象的功能,而无需修改原始对象的结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++设计模式:装饰器模式](https://blog.csdn.net/m0_73443478/article/details/129751085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉夢志昂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值