Decorator,Bridge屬於單一職責模式。
motivation:過度使用繼承來擴展對象的功能,由於繼承爲類型引入了靜態特性,是的這種擴展缺乏靈活性;並且隨着子類的增多,更多子類的組合會導致更多子類的膨脹。(使用組合優於繼承的設計原則)
上圖的衆多子類經過重構之後,形成下圖子類較少,更易維護的結構。
key interface or class:
1.實現基類的類型,如FileStream,NetWorkStream,MemoryStream;
2.裝飾類,用於對基本類型進行功能的擴展。
feature:在裝飾類中既繼承基類,也有基類的成員(某些實現)。
structure:
template codes:
//基類
class Stream{
public:
virtual void Read()=0;
virtual void Write()=0;
virtual void Seak()=0;
virtual ~Stream(){};
}
//不同類別的實現
class FileStream: public Stream{
//實現接口
}
class MemoryStream: public Stream{
//實現接口
}
class NetworkStream: public Stream{
//實現接口
}
//實現擴展功能的裝飾類
class CryptoStream: public Stream{
//構造時可以設爲FileStream,MemoryStream,NetworkStream等
//根據要實現擴展的對象
Stream* stream;
public:
CryptoStream(Stream* stream){
this->stream = stream;
}
virtual void Read(){
//此處增加額外的Crypto操作
stream->Read();
}
virtual void Write(){
//此處增加額外的Crypto操作
stream->Write();
}
virtual void Seak(){
//此處增加額外的Crypto操作
stream->Seak();
}
}
class BufferStream: public Stream{
//與上相似
}
class CryptoBufferStream: public Stream{
//與上相似
}
//調用
void process(){
Stream* fs = new FileStream();
Stream* ms = new MemoryStream();
Stream* ns = new NetworkStream();
//給不同Stream類擴展新功能——實現運行時裝配
CryptoStream* cptFs = new CryptoStream(fs); //給fs增加Crypto功能
BufferStream* bfrFs = new BufferStream(fs); //給fs增加buffer功能
CryptoBufferStream* cbFs = new CryptoBufferStream(fs); //給fs增加crypto和buffer功能
BufferStream* bCptFs = new BufferStream(cptFs); //給cptFs增加buffer功能
}
//爲了實現對裝飾器類中Stream*字段的複用,可以將該重複字段上提,但由於該字段爲基類Stream本身
//所遇你經常可以,設置一箇中間類來複Stream*字段,使裝飾類都繼承自該中間類
class decoratorStream: public Stream{
protect:
Stream* stream;
decoratorStream(Stream* stm): stream(stm){
}
}
class CryptoStream: public decoratorStream{
public:
//...
}
summary:
1. 採用組合而非繼承的手法,decorator模式在運行時動態擴展對象的功能,避免了使用繼承造成的不靈活和子類衆多的問題;
2.decorator模式在接口上表現出is-a的繼承關係,即decorator類繼承自接口component,同時在實現上又表現出has-a的組合關係,即decorator類中組合了一個component類;
3.decorator模式並非主要解決子類繁衍問題,主要是爲了實現主體類在多方向功能擴展的功能(即主體操作和分支操作應該分支分開繼承)。