#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;
}