“單一職責”模式:
在軟體元件的設計中,如果責任劃分的不清晰,使用繼承得到的結果往往是随着需求的變化,子類急劇膨脹,同時充斥着重複代碼,這時候的關鍵是劃清責任。
典型模式
.Decorator
.Bridge
1.Decorator模式

//業務操作
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
已經達到了要求!