李建忠装饰模式
Table of Contents
- 1. 原有软件 : 用继承来扩展Stream类
- 2. 软件问题 : 对继承的不良使用, 导致继承得到的类太多, 并且每个类中都有重复的操作, 运用装饰模式, 将继承改为组合
- 3. 软件依然有改进的地方 : CryptoStream和BufferedStream共有了Stream* stream, 按照设计模式, 应该将
- 4. 总结 : 装饰类的特点之一是继承自某个基类并且组合了这个基类
1 原有软件 : 用继承来扩展Stream类
//业务操作 class Stream{ public: virtual char Read(int number)=0; virtual void Seek(int position)=0; virtual void Write(char data)=0; virtual ~Stream(){} }; //主体类 class FileStream: public Stream{ public: virtual char Read(int number){ //读文件流 } virtual void Seek(int position){ //定位文件流 } virtual void Write(char data){ //写文件流 } }; class NetworkStream :public Stream{ public: virtual char Read(int number){ //读网络流 } virtual void Seek(int position){ //定位网络流 } virtual void Write(char data){ //写网络流 } }; //扩展操作 class CryptoFileStream :public FileStream{ public: virtual char Read(int number){ //额外的加密操作... FileStream::Read(number);//读文件流 } virtual void Seek(int position){ //额外的加密操作... FileStream::Seek(position);//定位文件流 //额外的加密操作... } virtual void Write(byte data){ //额外的加密操作... FileStream::Write(data);//写文件流 //额外的加密操作... } }; class CryptoNetworkStream : :public NetworkStream{ public: virtual char Read(int number){ //额外的加密操作... NetworkStream::Read(number);//读网络流 } virtual void Seek(int position){ //额外的加密操作... NetworkStream::Seek(position);//定位网络流 //额外的加密操作... } virtual void Write(byte data){ //额外的加密操作... NetworkStream::Write(data);//写网络流 //额外的加密操作... } };
2 软件问题 : 对继承的不良使用, 导致继承得到的类太多, 并且每个类中都有重复的操作, 运用装饰模式, 将继承改为组合
class CryptoStream: public Stream { Stream* stream;//... public: CryptoStream(Stream* stm):stream(stm){ } virtual char Read(int number){ //额外的加密操作... stream->Read(number);//读文件流 } virtual void Seek(int position){ //额外的加密操作... stream::Seek(position);//定位文件流 //额外的加密操作... } virtual void Write(byte data){ //额外的加密操作... stream::Write(data);//写文件流 //额外的加密操作... } }; class BufferedStream : public Stream{ Stream* stream;//... public: BufferedStream(Stream* stm):stream(stm){ } //... }; void Process(){ //运行时装配 FileStream* s1=new FileStream(); CryptoStream* s2=new CryptoStream(s1); BufferedStream* s3=new BufferedStream(s1); BufferedStream* s4=new BufferedStream(s2); }
3 软件依然有改进的地方 : CryptoStream和BufferedStream共有了Stream* stream, 按照设计模式, 应该将
它们放入基类Stream中, 但这里放入基类并不合适, 因为FileStream也继承自Stream, 但它并不需要Stream* stream, 所以这里构造了一个装饰类 https://www.bilibili.com/medialist/play/ml782687911 25:00
DecoratorStream: public Stream{ protected: Stream* stream;//... DecoratorStream(Stream * stm):stream(stm){ } }; class CryptoStream: public DecoratorStream { public: CryptoStream(Stream* stm):DecoratorStream(stm){ } virtual char Read(int number){ //额外的加密操作... stream->Read(number);//读文件流 } virtual void Seek(int position){ //额外的加密操作... stream::Seek(position);//定位文件流 //额外的加密操作... } virtual void Write(byte data){ //额外的加密操作... stream::Write(data);//写文件流 //额外的加密操作... } };
4 总结 : 装饰类的特点之一是继承自某个基类并且组合了这个基类
https://www.bilibili.com/medialist/play/ml782687911 32:00, 37:00