C++設計模式淺識裝飾模式

來源:互聯網
上載者:User
裝飾模式:動態給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更加靈活。

裝飾模式的四個角色:

組件類:Component

具體組件類:ConereteComponent

裝飾類:Decorator(從外類來擴充Component類的功能,但對於Component來說是無需知道Decorator存在的。)

具體裝飾類:ConcreteDecorator(起到給Component添加職責的功能)

在此,以人們穿衣修飾為例實現裝飾模式。

測試案例:

[code]int main(){    //初始化person(人)組件類Component,如果只有一個ConereteComponent類而不需要抽象的Component類,那麼可以直接讓Decorator繼承具體的Component類。    concretePerson *cp = new concretePerson("Jarrett");    //初始化具體服飾類(裝飾類Decorate)    concreteTshirts *Tshirts = new concreteTshirts;    concreteTrouser *Trouser = new concreteTrouser;    concreteShoes *Shoe = new concreteShoes;    //concreteSuit *Suit = new concreteSuit;    concreteHat *Hat = new concreteHat;    //依次進行裝飾    Tshirts->decorate(cp);    Trouser->decorate(Tshirts);    Shoe->decorate(Trouser);    //Suit->decorate(Shoe);    //顯示結果    Shoe->show();    std::cout << std::endl;    //再裝飾一次查看效果    Hat->decorate(Shoe);    Hat->show();    return 0;}

裝飾模式實現:

[code]//主類class concretePerson{private:    std::string name;//人名public:    concretePerson(){}    concretePerson(std::string n):name(n){} //構造方式    virtual void show()const{        std::cout << name << "'s dress: ";    }};//服飾類(裝飾類主類)class Finery: public concretePerson{protected:    concretePerson *cPerson;//重點是維護一個主體類對象public:    void decorate(concretePerson *cp){        cPerson = cp;    }    void show()const{        if(cPerson != NULL)            cPerson->show();    }};//具體服飾類Tshirtsclass concreteTshirts: public Finery{public:  void show()const{      Finery::show(); //調用基類方法      std::cout << "Tshirts ";  //用此來修飾  }};//具體服飾類Tshirtsclass concreteTrouser: public Finery{public:  void show()const{      Finery::show(); //調用基類方法      std::cout << "Trouser ";  //用此來修飾  }};//具體服飾類Tshirtsclass concreteShoes: public Finery{public:  void show()const{      Finery::show(); //調用基類方法      std::cout << "Shoe ";  //用此來修飾  }};//具體服飾類Tshirtsclass concreteSuit: public Finery{public:  void show()const{      Finery::show(); //調用基類方法      std::cout << "Suit ";  //用此來修飾  }};//具體服飾類Tshirtsclass concreteHat: public Finery{public:  void show()const{      Finery::show(); //調用基類方法      std::cout << "Hat ";  //用此來修飾  }};


總結:

裝飾模式是為已有功能動態地添加更多的功能的一種方式。

應該在什麼時候使用呢?

如果在一個已有程式中添加的功能僅僅是為了滿足只在某些特定情況下才會執行的特殊行為的需要,若在主類中添加代碼會增加主類複雜度。這時就需要裝飾模式把每個要裝飾的功能放在單獨的類中,並讓這個類封裝它所要裝飾的對象。

因為,當需要執行特殊行為時,客戶代碼就可以在運行時根據需要有選擇的按順序地使用裝飾功能封裝對象。

裝飾模式的意思就是你自己的主體類和具體類該怎麼寫就怎麼寫,我想額外地增加特殊功能時,就使用額外的類來增加功能,這樣做比產生子類更加靈活,不需要修改原主體類和具體類的代碼。

這樣將類中的裝飾功能從主類搬移去除,可以簡化原有的類。有效把類的核心職責和裝飾功能區分開來,而且可以去除相關類中重複的裝飾邏輯。


以上就是C++設計模式淺識裝飾模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.