【一分钟学C++】装饰者模式

在这里插入图片描述

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~
个人主页: rainInSunny  |  个人专栏: C++那些事儿Learn OpenGL In Qt
  装饰者模式是一种结构型设计模式,它允许动态地向对象添加新的功能,而无需修改其原始代码。在C++中,装饰者模式通常通过继承和组合来实现。
#include <iostream>  
  
// 抽象类
class Stream
{
public:
    Stream();
    virtual ~Steam();
    
    virtual void read() = 0;
    virtual void write() = 0;
    virtual void seek() = 0;
};

// 文数据件流
class FileStream : public Stream
{
public:
    FileStream();
    virtual ~FileStream();

    void read() override;
    void write() override;
    void seek() override;
};

// 网络数据流
class NetworkStream : public Stream
{
public:
    NetworkStream();
    virtual ~NetworkStream();

    void read() override;
    void write() override;
    void seek() override;
};

  假设现在有文件数据流,网络数据流两类数据流,现需要对两者进行加密解密处理,如果用传统的继承思路,需要额外写出加密的文件数据流,加密的网络数据流。如果有更多类型数据流,就需要更多继承加密的类来实现。这样会导致类急剧增长。

// 加密数据流 
class EncryptStream : public Stream
{
public:
    EncryptStream(Stream *pStream);
    virtual ~EncryptStream();

    void decrypt();
    void encrypt();

    void read() override
    {
        decrypt();
        m_stream->read();
    }

    void write() override
    {
        encrypt();
        m_stream->write();
    }

    virtual void seek() override
    {
    }

private:
    Stream *m_stream;
};

  现在添加一个加密流的类,继承自Stream,并且包含一个Stream*指针,这样继承加组合的方式是装饰者的典型特征,继承特性让EncryptStream对外提供的接口保持不变,组合的好处在于让EncryptStream中包含Stream*指针,能指向任意继承自Stream的数据流。这样可以在仅仅扩展一个类的情况下,给继承自Stream的所有数据流类扩展加密解密功能。

int main()
{
    FileStream *fileStream = new FileStream();
    EncryptStream *encryptFileStream = new EncryptStream(fileStream);
    
    NetworkStream *netStream = new NetworkStream();
    EncryptStream *encryptNetStream = new EncryptStream(netStream);
    return 0;
}
  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值