装饰模式
“单一职责”模式:
在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。
典型模式
.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
已经达到了要求!