裝飾者模式

2021-08-18 04:07:58 字數 651 閱讀 3175

比如:一開始的程式中有乙隻鴨子擁有fly方法,現在我們希望鴨子在飛的時候還能唱歌,或者是飛之後休息,那麼我們會想到繼承原來的鴨子(這違反了程式設計原則:少用繼承),或者是直接修改鴨子類(這麼做肯定是不科學的)。

有什麼好的方法讓我們既可以動態的擴充套件程式的方法,又不修改原來的類呢?

裝飾者模式能動態的將責任新增到類上,提供了比繼承更具有彈性的代替方案。

實現的關鍵要求是裝飾者與被裝飾者要是同一物件,即他們需要繼承自同一介面或是同一類。然後裝飾者中擁有被裝飾者的引用(利用到了組合的方式)。

例如jdk原始碼中的io包下就有許多裝飾者模式的實現例子。

例如inputstream這是乙個抽象類,他下面有一些實現類:fileinputstream,bytearrayinputstream,audioinputstream,stringbufferinputstream等,這些類都實現了inputstream的抽象方法,但是有乙個類filterinputstream,他雖然也繼承自inputstream,但是卻沒有具體的實現方法,他有乙個inputstream的引用,他的所有方法都是呼叫inputstream的方法,這就是乙個「抽象的裝飾者基類」,,他的一些子類就是具體的裝飾者。

以後在看到乙個類中有乙個抽象類或者介面的引用的時候,很大概率該類就是乙個裝飾者。

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...