设计模式(五)decorator
来源:互联网 发布:淘宝联盟怎么满减 编辑:程序博客网 时间:2024/06/10 14:38
1.使用场景:需要很多的继承来拓展对象的功能,子类之间静态特质代码大量重复
2.理论依据:多态、虚函数
3.定义:动态(组合)地给一个对象增加额外的职责,decorator模式比生成子类
更为灵活(消除重复代码+减少子类个数)
4.步骤:使用基类指针,将继承改为组合模式
继承基类的同时,组合基类
5.技法:继承->组合
编译时装配->运行时装配(多态)
6.变化:拓展的功能
不变:每个拓展功能对应的操作
原代码:
//业务操作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 MemoryStream :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);//写网络流 //额外的加密操作... }};class CryptoMemoryStream : public MemoryStream{public: virtual char Read(int number){ //额外的加密操作... MemoryStream::Read(number);//读内存流 } virtual void Seek(int position){ //额外的加密操作... MemoryStream::Seek(position);//定位内存流 //额外的加密操作... } virtual void Write(byte data){ //额外的加密操作... MemoryStream::Write(data);//写内存流 //额外的加密操作... }};class BufferedFileStream : public FileStream{ //...};class BufferedNetworkStream : public NetworkStream{ //...};class BufferedMemoryStream : public MemoryStream{ //...}class CryptoBufferedFileStream :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);//写文件流 //额外的加密操作... //额外的缓冲操作... }};void Process(){ //编译时装配 CryptoFileStream *fs1 = new CryptoFileStream(); BufferedFileStream *fs2 = new BufferedFileStream(); CryptoBufferedFileStream *fs3 =new CryptoBufferedFileStream();}
decorator设计模式代码:
//业务操作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 MemoryStream :public Stream{public: virtual char Read(int number){ //读内存流 } virtual void Seek(int position){ //定位内存流 } virtual void Write(char data){ //写内存流 } };//扩展操作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);//写文件流 //额外的加密操作... }};class BufferedStream : public DecoratorStream{ Stream* stream;//... public: BufferedStream(Stream* stm):DecoratorStream(stm){ } //...};void Process(){ //运行时装配 FileStream* s1=new FileStream(); CryptoStream* s2=new CryptoStream(s1); BufferedStream* s3=new BufferedStream(s1); BufferedStream* s4=new BufferedStream(s2); }
阅读全文
0 0
- 设计模式(五)decorator
- 设计模式(五):装饰模式(Decorator)
- 设计模式学习(五) -- 装饰者模式 Decorator Pattern
- (五)Decorator模式学习
- (Boolan)C++设计模式 <五> ——装饰模式(Decorator)
- 设计模式-装饰模式(Decorator Pattern)
- 设计模式---装饰模式(decorator)
- 设计模式 (十)装饰模式(Decorator)
- 设计模式 (十)装饰模式(Decorator)
- 设计模式 (十)装饰模式(Decorator)
- 【设计模式】之装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之 装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- Java设计模式---装饰模式(Decorator)
- 设计模式(7)--Decorator 装饰模式
- 设计模式:装饰模式(Decorator)
- 设计模式之装饰(Decorator)模式
- JavaScript入门
- 第十章 PX4-Pixhawk-姿态控制
- JS函数声明提升和变量声明提升
- : Unable to connect to a repository at URL 'https://u-pc/svn/taotao/trunk/taotao/taotao-parent'
- 2017.6.27 学习记录 SVN 和 MySql工具的使用
- 设计模式(五)decorator
- 数据库索引的原理
- mysql常用命令
- Java小知识积累
- windows10在4k分辨率下eclipse,photoshop,百度云等工具栏图标会变得很小的问题方法总结(主要是eclipse)
- 两两交换链表中的节点
- 第一行代码 第三章 ListView
- ssh connection in ros
- pycharm中遇到“unresolved reference 'name'..."问题