ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-18 21:01:47  阅读:190  来源: 互联网

标签:... int void c++ 装饰 char virtual 设计模式 public


视频地址:

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

在这里插入图片描述

标签:...,int,void,c++,装饰,char,virtual,设计模式,public
来源: https://www.cnblogs.com/MGFangel/p/16286269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有