注意是類的擴充套件-修改,而不是業務流程**,當有新的行為時,業務流程**肯定要變,但是類可以不變和復用。
繼承沒有彈性,那是因為類的行為在編譯時就靜態決定了,想改變行為,必須修改源**。組合有彈性,是因為類的行為是通過組合的超類呼叫的,當超類引用指向不同的實現類物件時,只用擴充套件實現類物件而不用修改類的源**,類就能產生不同的行為,這種就可以說類的行為在執行時動態決定,這增加了該類的彈性和復用性。
只要將變化的部分抽離,和不變的部分隔離開來,就會很好的實現擴充套件-修改原則,擴充套件的時候,最好不要用繼承,而要用組合+多型進行擴充套件,這樣可以動態的新增新的行為。
設計中不是每乙個部分都應用開放-關閉原則的,這樣實在是一種浪費,且導致**變得複雜且難以理解。你需要把注意力集中在設計中最有可能改變的地方,然後應用開放-關閉原則。
裝飾者模式完全符合該擴充套件-修改原則。
裝飾者和被裝飾者擁有相同的超型別。裝飾者組合被裝飾者,委託其產生行為,並在該行為前/後加上自己的包裝行為。
裝飾的層數過多,有可能導致**的疏漏,因此一般結合工廠模式或生成器使用。如果不了解裝飾者模式,當面對大量的裝飾者和被裝飾者時,會造成極大的困擾。
裝飾,必須有乙個基礎元件作為被裝飾者。比如一杯咖啡是基礎元件,那麼拿鐵咖啡,卡布奇諾咖啡,冰咖啡,大杯咖啡就是裝飾者,裝飾者在裝飾基礎元件後,就變成了被裝飾者,被裝飾者外面又可以被裝飾者巢狀。由於大家都是咖啡,而類中都是用咖啡這個超類進行呼叫,所以包裝的順序可以隨意組合的。大杯(冰(拿鐵(咖啡))),這種包裝關係,最後的大杯咖啡仍是咖啡,呼叫方是無感知的,但是其功能卻增強了。
抽離變化的部分:不變的是基礎元件,變化的部分是在元件的基礎上會新增各種各樣變化的包裝。
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...