設計模式——裝飾器模式(decorator)

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模式並非主要解決子類繁衍問題,主要是爲了實現主體類在多方向功能擴展的功能(即主體操作和分支操作應該分支分開繼承)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章