裝飾模式:動態給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更加靈活。
裝飾模式的四個角色:
組件類: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)!