前言
在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。
单一职责:
Decorator设计模式
解决的问题
- 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质(多态就是动态),使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会
导致更多子类的膨胀
。
如下所示,我们有文件流、网络流和内存流3种,都有流需要的read、seek和write
操作。
//业务操作
class Stream{
public:
virtual void Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(char data) = 0;
virtual ~Stream(){
}
};
//主体类
class FileStream : public Stream{
public:
virtual void Read(int number){
//读文件流
cout << "FileStream read" << endl;
}
virtual void Seek(int position){
//定位文件流
cout << "FileStream seak" << endl;
}
virtual void Write(char data){
//写文件流
cout << "FileStream write" << endl;
}
};
class NetworkStream :public Stream{
public:
virtual void Read(int number){
//读网络流
cout << "NetworkStream read" << endl;
}
virtual void Seek(int position){
//定位网络流
cout << "NetworkStream seak" << endl;
}
virtual void Write(char data){
//写网络流
cout << "NetworkStream write" << endl;
}
};
class MemoryStream :public Stream{
public:
virtual void Read(int number){
//读网络流
cout << "MemoryStream read" << endl;
}
virtual void Seek(int position){
//定位网络流
cout << "MemoryStream seak" << endl;
}
virtual void Write(char data){
//写网络流
cout << "MemoryStream write" << endl;
}
};
现在我们需要扩展一下3种流操作,比如说,在read、seek和write
操作时加密,或者是加入缓冲,或者是加密+缓冲。
那么我们很容易会想到用继承的方式实现,如下:
//扩展操作:加密
class CryptoFileStream :public FileStream{
public:
virtual void Read(int number){
//额外的加密操作...
cout << endl << "加密!" << endl;
FileStream::Read(number);//读文件流
}
virtual void Seek(int position){
//额外的加密操作...
cout << endl << "加密!" << endl;
FileStream::Seek(position);//定位文件流
//额外的加密操作...
}
virtual void Write(char data){
//额外的加密操作...
cout << e