天天看點

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

快到媳婦生日了,這幾天加班加點的幹活,給媳婦買了個ipadmini,可把媳婦樂壞了,媳婦拿到手第一天,就跑出去跟姐妹們得瑟了一把。

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

#include <iostream>  

using namespace std;  

class pad  

{  

public:  

    pad(){ }  

    virtual ~pad(){ }  

    virtual void show( ) = 0;  

};  

class ipad : public pad  

public :  

    ipad( ){ }  

    virtual ~ipad( ){  };  

    void show( )  

    {  

        std::cout <<"新的ipad mini..." <<endl;  

    }  

int main( )  

    // 給媳婦買了一個ipadmini  

    pad *pad = new ipad( );  

    pad->show( );               // 跑出去得瑟一下  

    return 0;  

}  

晚上回來,我問她,開心不,她說,開心是開心,但是朋友們都說怎麼沒給pad弄個保護套,要不容易摔,摔壞了去維修可是很貴的,我嘻嘻一笑,容易直接上蘋果店買了一個,走上路上美滋滋的。

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

// pad類的抽象接口  

// 新的ipadmini  

// 加了保護套的ipadmini  

class coveripad : public ipad  

    coveripad( ){ }  

    virtual ~coveripad( ){  };  

        std::cout <<"加了保護套的,新的ipad mini..." <<endl;  

    // 現在我買了一個ipadmini  

    pad *pad = new coveripad( );  

回家拿給媳婦看,媳婦說,老公能不能再給貼個膜啊 ,人家指甲長,萬一把屏劃花了怎麼辦呢呢,還有....(此處省略一萬字),好吧再次出發,等等,難道要我在派生出一個coverfoilipad,天天這樣子一天一個新的花樣,這架構得多複雜,不行得換個方式。

我想想,直接弄裝飾得了,那些保護套,貼膜什麼的不都是裝飾麼。。

好了裝飾模式出現了。

基礎還是我們的ipad,

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

//公共抽象類  

// 對應于 -=> 抽象構件(component)角色  

// 具體構件(concrete component)角色  

下面是那些裝飾,保護套,貼膜,管你是什麼,愛來多少來多少,咱不怕

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

// 裝飾(decorator)角色:  

class decorator : public pad  

    decorator(pad *pad)  

        m_pad = pad;  

    virtual ~decorator( ){ };  

        this->m_pad->show( );       // 展示一下自己的手機  

protected:  

    pad *m_pad;  

    virtual void adddecorator( ) = 0;  

// 具體裝飾(concrete decorator)角色  

class coverdecorator : public decorator  

    coverdecorator(pad *pad)  

    :decorator(pad)  

    virtual ~coverdecorator( ){ }  

        this->adddecorator( );  

        decorator::show( );  

    void adddecorator( )  

        std::cout <<"弄了個保護套";  

class foildecorator : public decorator  

    foildecorator(pad *pad)  

    virtual ~foildecorator( ){ }  

        std::cout <<"貼了個的貼膜,";  

下面看看媳婦怎麼去得瑟的

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

    // 不行,還需要加個保護套  

    pad *covedeco = new coverdecorator(pad);  

    covedeco->show( );               // 現在可以了吧,再出去得色一下  

    // 好吧,再來個貼膜  

    pad *foildeco = new foildecorator(covedeco);  

    foildeco->show( );  

又叫裝飾者模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下,動态的擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象

C++設計模式8--裝飾模式(Decorator)--動态的增減功能 新奇的IPad  弄個保護套 還要個貼膜??? 模式總結

①裝飾對象和真實對象有相同的接口。這樣用戶端對象就可以和真實對象相同的方式和裝飾對象互動。

② 裝飾對象包含一個真實對象的引用(reference)

③ 裝飾對象接受所有來自用戶端的請求。它把這些請求轉發給真實的對象。

④裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確定了在運作時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實作對給定類的功能擴充。

1. 裝飾者和被裝飾對象有相同的超類型。

2. 可以用一個或多個裝飾者包裝一個對象。

3. 裝飾者可以在所委托被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。

4. 對象可以在任何時候被裝飾,是以可以在運作時動态的,不限量的用你喜歡的裝飾者來裝飾對象。

5. 裝飾模式中使用繼承的關鍵是想達到裝飾者和被裝飾對象的類型比對,而不是獲得其行為。

6. 裝飾者一般對元件的客戶是透明的,除非客戶程式依賴于元件的具體類型。在實際項目中可以根據需要為裝飾者添加新的行為,做到“半透明”裝飾者。

在以下情況下應當使用裝飾模式:

1.需要擴充一個類的功能,或給一個類增加附加責任。 

2.需要動态地給一個對象增加功能,這些功能可以再動态地撤銷。 

3.需要增加由一些基本功能的排列組合而産生的非常大量的功能,進而使繼承關系變得不現實。

1. decorator模式與繼承關系的目的都是要擴充對象的功能,但是decorator可以提供比繼承更多的靈活性。

2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

1. 這種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。

2. 裝飾模式會導緻設計中出現許多小類,如果過度使用,會使程式變得很複雜。

轉載:http://blog.csdn.net/gatieme/article/details/18034425