c++设计模式之装饰器模式

视频地址:

https://www.ixigua.com/6804249883344634380?id=6803643043019751947

文档整理地址:

http://t.csdn.cn/PwSdq

装饰器模式样例类图:

 

 

 代码样例:

复制代码
  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 }
复制代码

类的规模:1+n+1+m

在这里插入图片描述

posted @   跳动的休止符  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示