博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰模式
阅读量:6903 次
发布时间:2019-06-27

本文共 4343 字,大约阅读时间需要 14 分钟。

“单一职责”模式:

在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。

典型模式

.Decorator
.Bridge

1.Decorator模式

代码1:

//业务操作class Stream{    virtual char Read(int number) = 0;    virtual char Seek(int position) = 0;    virtual char Write(int data) = 0;    virtual ~Stream(){}};//主类体class FileStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位文件流    }    virtual char Write(int data){        //写文件流    }};class NetworkStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位网络流    }    virtual char Write(int data){        //写文件流    }};class MemoryStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位内存流    }    virtual char Write(int data){        //写文件流    }};//扩展操作class CryptoFileStream :public FileStream{public:    virtual char Read(int number){        //额外的加密操作....        FileStream::Read(number);//读文件流    }    virtual char Seek(int position){         //额外的加密操作....        FileStream::Seek(position);//定位文件流        //额外的加密操作....    }    virtual char Write(int data){                //额外的加密操作....        FileStream::Write(data);//写文件流        //额外的加密操作....    }};class BufferedFileSyream :public FileStream{    //...};class BufferedNetWorkStream :public NetworkStream{};class BufferedMemoryStream : public MemoryStream{};class CryptoBuffedFileStream :public FileStream{public:    virtual char Read(int number){        //额外的加密操作        //额外的缓冲操作        FileStream::Read(number);//读文件流    }    virtual char Seek(int position){         //额外的加密操作        //额外的缓冲操作        FileStream::Seek(position);//定位内存流    }    virtual char Write(int data){         //额外的加密操作        //额外的缓冲操作        FileStream::Write(data);//写文件流    }};void Process(){    //编译时装配    CryptoFileStream* fs1 = new CryptoFileStream;    BufferedFileSyream *fs2 = new BufferedFileSyream;    CryptoBuffedFileStream* fs3 = new CryptoBuffedFileStream;}

该代码有什么问题?

冗余度太高!

示意图:

 

该类的规模有多少?

1+n+n*m!/2

很明显,规模太大,在之后的维护中会占很大的时间

因此,为了消除冗余,使用装饰模型来修改上面的代码

代码2:

 

//业务操作class Stream{    virtual char Read(int number) = 0;    virtual char Seek(int position) = 0;    virtual char Write(int data) = 0;    virtual ~Stream(){}};//主类体class FileStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位文件流    }    virtual char Write(int data){        //写文件流    }};class NetworkStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位网络流    }    virtual char Write(int data){        //写文件流    }};class MemoryStream :public Stream{public:    virtual char Read(int number){        //读文件流    }    virtual char Seek(int position){        //定位内存流    }    virtual char Write(int data){        //写文件流    }};//扩展操作//当一个变量的声明类型都是某个类型的子类时候,那么把他声明为某个类型就可以了class DecoratorStream:public Stream{protected:    Stream* stream;    DecoratorStream(Stream stm) :stream(stm){    //构造器    }}class CryptoStream :public DecoratorStream{public:    CryptoStream(Stream stm) :stream(stm){    //构造器    }    virtual char Read(int number){        //额外的加密操作....        stream->Read(number);//读文件流    }    virtual char Seek(int position){        //额外的加密操作....        stream->Seek(position);//定位文件流        //额外的加密操作....    }    virtual char Write(int data){        //额外的加密操作....        stream->Write(data);//写文件流        //额外的加密操作....    }};class BufferedSyream :public DecoratorStream{    //...public:    BufferedSyream(Stream stm) :stream(stm){    //构造器    }};class CryptoBuffedFileStream :public FileStream{public:    virtual char Read(int number){        //额外的加密操作        //额外的缓冲操作        FileStream::Read(number);//读文件流    }    virtual char Seek(int position){        //额外的加密操作        //额外的缓冲操作        FileStream::Seek(position);//定位内存流    }    virtual char Write(int data){        //额外的加密操作        //额外的缓冲操作        FileStream::Write(data);//写文件流    }};void Process(){    //编译时装配    FileStream* s1 = new FileStream();    CryptoStream* s2 = new CryptoStream(s1);    BufferedSyream* s3 = new BufferedSyream(s1);    BufferedSyream* s4 = new BufferedSyream(s2);}

 

示意图:

代码的规模为:1+n+1+m

已经达到了要求!

 

 

转载于:https://www.cnblogs.com/zhuifeng-mayi/p/11059454.html

你可能感兴趣的文章
select 标签级联 和 html增加/删除行
查看>>
java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)
查看>>
ARM编译器中预定义的宏
查看>>
几个网站
查看>>
js介绍及内容(1)
查看>>
The Infinite Loop belong to loop statement
查看>>
聊天室
查看>>
慢慢积累 ---------- unity 碰撞 和 碰撞之后
查看>>
5.Struts2-Struts标签
查看>>
记一次修炼路上的JDBC链接数据库的案例
查看>>
两个栈实现一个队列
查看>>
数据库分页
查看>>
ehcache的介绍和使用
查看>>
Android利用Gson解析嵌套多层的Json
查看>>
log4j.properties配置详解与实例
查看>>
Spring学习笔记:Spring概述,第一个IoC依赖注入案例
查看>>
let和var的区别
查看>>
《面向模式的软件体系结构1--模式系统》读书笔记(9)--- 模式系统
查看>>
2012年11月8日学习研究报告
查看>>
《黑客与画家》读后感
查看>>