c++设计模式之装饰器模式
视频地址:
https://www.ixigua.com/6804249883344634380?id=6803643043019751947
文档整理地址:
装饰器模式样例类图:
代码样例:
1 //业务操作 2 class Stream { 3 public: 4 virtual char Read(int number) = 0; 5 virtual void Seek(int position) = 0; 6 virtual void Write(char data) = 0; 7 8 virtual ~Stream() {} 9 }; 10 11 //主体类 12 class FileStream : public Stream { 13 public: 14 virtual char Read(int number) { 15 //读文件流 16 } 17 virtual void Seek(int position) { 18 //定位文件流 19 } 20 virtual void Write(char data) { 21 //写文件流 22 } 23 24 }; 25 26 class NetworkStream :public Stream { 27 public: 28 virtual char Read(int number) { 29 //读网络流 30 } 31 virtual void Seek(int position) { 32 //定位网络流 33 } 34 virtual void Write(char data) { 35 //写网络流 36 } 37 38 }; 39 40 class MemoryStream :public Stream { 41 public: 42 virtual char Read(int number) { 43 //读内存流 44 } 45 virtual void Seek(int position) { 46 //定位内存流 47 } 48 virtual void Write(char data) { 49 //写内存流 50 } 51 52 }; 53 54 //扩展操作 55 class CryptoFileStream :public FileStream { 56 public: 57 virtual char Read(int number) { 58 59 //额外的加密操作... 60 FileStream::Read(number);//读文件流 61 62 } 63 virtual void Seek(int position) { 64 //额外的加密操作... 65 FileStream::Seek(position);//定位文件流 66 //额外的加密操作... 67 } 68 virtual void Write(byte data) { 69 //额外的加密操作... 70 FileStream::Write(data);//写文件流 71 //额外的加密操作... 72 } 73 }; 74 75 class CryptoNetworkStream : public NetworkStream{ 76 public: 77 virtual char Read(int number) { 78 79 //额外的加密操作... 80 NetworkStream::Read(number);//读网络流 81 } 82 virtual void Seek(int position) { 83 //额外的加密操作... 84 NetworkStream::Seek(position);//定位网络流 85 //额外的加密操作... 86 } 87 virtual void Write(byte data) { 88 //额外的加密操作... 89 NetworkStream::Write(data);//写网络流 90 //额外的加密操作... 91 } 92 }; 93 94 class CryptoMemoryStream : public MemoryStream { 95 public: 96 virtual char Read(int number) { 97 98 //额外的加密操作... 99 MemoryStream::Read(number);//读内存流 100 } 101 virtual void Seek(int position) { 102 //额外的加密操作... 103 MemoryStream::Seek(position);//定位内存流 104 //额外的加密操作... 105 } 106 virtual void Write(byte data) { 107 //额外的加密操作... 108 MemoryStream::Write(data);//写内存流 109 //额外的加密操作... 110 } 111 }; 112 113 class BufferedFileStream : public FileStream { 114 //... 115 }; 116 117 class BufferedNetworkStream : public NetworkStream { 118 //... 119 }; 120 121 class BufferedMemoryStream : public MemoryStream { 122 //... 123 }; 124 125 126 127 class CryptoBufferedFileStream :public FileStream { 128 public: 129 virtual char Read(int number) { 130 131 //额外的加密操作... 132 //额外的缓冲操作... 133 FileStream::Read(number);//读文件流 134 } 135 virtual void Seek(int position) { 136 //额外的加密操作... 137 //额外的缓冲操作... 138 FileStream::Seek(position);//定位文件流 139 //额外的加密操作... 140 //额外的缓冲操作... 141 } 142 virtual void Write(byte data) { 143 //额外的加密操作... 144 //额外的缓冲操作... 145 FileStream::Write(data);//写文件流 146 //额外的加密操作... 147 //额外的缓冲操作... 148 } 149 }; 150 151 void Process() { 152 153 //编译时装配 154 CryptoFileStream* fs1 = new CryptoFileStream(); 155 156 BufferedFileStream* fs2 = new BufferedFileStream(); 157 158 CryptoBufferedFileStream* fs3 = new CryptoBufferedFileStream(); 159 }
类的规模:1+n+n*m!/2,原因是对类的继承不良使用
重构后类图:
重构后代码:
1 //业务操作 2 class Stream { 3 public: 4 virtual char Read(int number) = 0; 5 virtual void Seek(int position) = 0; 6 virtual void Write(char data) = 0; 7 virtual ~Stream() {} 8 }; 9 //主体类 10 class FileStream : public Stream { 11 public: 12 virtual char Read(int number) { 13 //读文件流 14 } 15 virtual void Seek(int position) { 16 //定位文件流 17 } 18 virtual void Write(char data) { 19 //写文件流 20 } 21 22 }; 23 24 class NetworkStream :public Stream { 25 public: 26 virtual char Read(int number) { 27 //读网络流 28 } 29 virtual void Seek(int position) { 30 //定位网络流 31 } 32 virtual void Write(char data) { 33 //写网络流 34 } 35 36 }; 37 38 class MemoryStream :public Stream { 39 public: 40 virtual char Read(int number) { 41 //读内存流 42 } 43 virtual void Seek(int position) { 44 //定位内存流 45 } 46 virtual void Write(char data) { 47 //写内存流 48 } 49 50 }; 51 //扩展操作 52 //中间装饰类 53 class DecoratorStream : public Stream { 54 protected: 55 Stream* stream;//... 56 57 DecoratorStream(Stream* stm) :stream(stm) { 58 59 } 60 61 }; 62 63 class CryptoStream : public DecoratorStream { 64 65 66 public: 67 CryptoStream(Stream* stm) :DecoratorStream(stm) { 68 69 } 70 71 virtual char Read(int number) { 72 73 //额外的加密操作... 74 stream->Read(number);//读文件流 75 } 76 virtual void Seek(int position) { 77 //额外的加密操作... 78 Stream::Seek(position);//定位文件流 79 //额外的加密操作... 80 } 81 virtual void Write(byte data) { 82 //额外的加密操作... 83 Stream::Write(data);//写文件流 84 //额外的加密操作... 85 } 86 }; 87 88 class BufferedStream : public DecoratorStream { 89 90 Stream* stream;//... 91 92 public: 93 BufferedStream(Stream* stm) :DecoratorStream(stm) { 94 95 } 96 //... 97 }; 98 99 void Process() { 100 101 //运行时装配 102 FileStream* s1 = new FileStream(); 103 104 CryptoStream* s2 = new CryptoStream(s1); 105 106 BufferedStream* s3 = new BufferedStream(s1); 107 108 BufferedStream* s4 = new BufferedStream(s2); 109 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具