裝飾模式(完全體會了此模式含義)

2022-03-13 15:40:48 字數 3580 閱讀 3724

第三次複習

場景:

通常情況下,擴充套件乙個類的功能會使用繼承方式來實現。但繼承具有靜態特徵,耦合度高,並且隨著擴充套件功能的增多,子類會很膨脹。

如果使用組合關係來建立乙個包裝物件(即裝飾物件)來包裹真實物件,並在保持真實物件的類結構不變的前提下,為其提供額外的功能,

這就是裝飾器模式的目標。

要清楚,此模式的場景,是有乙個被裝飾物件,比如a,不想修改它。

其他裝飾後的物件,比如b,c,d,都必須包含a。

本體a,和裝飾後的b,c,d,都必須實現裝飾功能,也就是介面。

但是b,c,d最好是實現虛類,這樣可以規範裝飾類必須符合2點,1.必須包含本地,2.實現裝飾功能。而介面只能實現第2點。

這個模式,可以形成豐富多彩的類,所以屬於結構型模式。

作用是這句:動態地擴充套件其功能,動態說明不能繼承,只能組合,繼承是靜態擴充套件。

結構是這句:實現介面的自包含的虛類。

第二次分析感受:

看了下第一次分析。基本是把握到了本質。沒有什麼偏差。

補充下使用場景需求

1.原物件類必須存在,

2.需要動態組合新功能。

所以下面是推導模式的流程:

所以我們最初的考慮會是新增乙個介面,再通過繼承複寫介面功能來擴充套件功能。

但是這個繼承必須是組合形式的繼承。因為需要在原功能的基礎上擴充套件。所以還必須包含原物件。但是這樣的話介面就沒有強制性了(不能強制要求介面的派生類包含原物件)

所以可以用虛類,定義乙個原物件成員變數。而虛類和被裝飾的類都派生於同一介面(包含我們需要擴充套件的函式)。就解決了。

第一次分析:

這個模式也是之前沒看懂。

需要看懂的話,要給自己提明確需求。之前沒看懂就是因為很多書沒有告訴你,為什麼要放棄簡單的方案。估計那些作者也沒有深刻體會吧。

如,乙個戰士有形象展示。需要給個方案,可以靈活的加特效,如加個冰背景,火背景等。

先不要裝b,最開始一定會是直接在類裡面加方法。 結果,非常ok。如果你也滿意,同事,客戶都滿意,而且以後改動都不大。那麼裝飾模式可以根本不要學習。估計你一輩子都用不到。

非常特特特殊情況。裝飾動作太繁多,改動太頻繁。那麼才需要裝飾模式。

新的要求。不要在類裡面修改。把修改踢到類的外面。 那麼逼迫自己想方案。

你會嘗試很多方案,大多數都是錯誤的。

這個方案最起碼有幾點。

1必須輸入輸出都是原來的物件。不管你用函式,介面。虛類。各種技術都行,開始別confine自己。

2.需要對原來物件的某個方法複寫。

3.繼承的寫法,是不行的,因為需要無窮的類。想想加火的特效。如果是效果是一點一點的加,想想看。要1000個火特效,需要繼承1000次。中間再差點其他特效,而且順序有關。簡直無解。

4.基本上會逼迫你走向乙個虛類繼承被裝飾類,幷包含乙個被裝飾類物件。這樣就為形成鏈條做好了準備,因為包含的是被裝飾類,那麼最初可以放入基礎被裝飾類,之後又可以把被裝飾類的派生類放進去,形成乙個裝飾類的派生類,而它又可以放入到。。。

當方法複寫的時候。呼叫包含的裝飾類物件的方法。 只有這個時候你才明白,哦,這是裝飾模式。才會發現,原來裝飾模式這麼巧妙。

包含被裝飾類,並覆蓋方法,呼叫被裝飾類的方法,這個是完成了裝飾的目的,比較容易推出來。而最後虛類繼承被裝飾類,是乙個神來之筆。巧妙。

裝飾模式從某種意義上,也是對組合方式的支援,繼承固定性,無法滿足。可以想象為最後展示戰士的時候,是乙個戰士經過乙個又乙個類,這些類,只是把自己包裹了一下,並對某個方法包裝了一下。

個人覺得,除非是真的體現了裝飾功能,意思就是多變,否則可以用繼承。

而且你對**要求高,否則可以把新的裝飾功能,放入到類中。

總結,非常巧妙的模式,和工廠方法一樣。都非常巧妙,令人驚嘆,但是有簡單,易用的替代方案。如果不是特別嚴苛的話,基本不會使用。

關鍵**:

public

abstract

class

decorator extends baseclass//這裡是神來之筆

@override 

public

string showme()

}

public

class

decorator

public

string addfire(string show)

public

string addwater(string show)

public

string addsword(string show)

}public

class

heightbsolider

}//裝飾模式,本意是裝飾,不改變物件

//所以,1.必須是輸入和輸出都是原來的物件。

//其次,2.一般是對某個方法的複寫。

//所以最直觀的是繼承。但是不靈活,2中變化,排列要4個類。

//所以整來整去,裝飾類必須繼承被裝飾類,才能同時滿足1,2. 2個條件。

//而且裝飾類必須包含乙個被裝飾類,這樣當裝飾類複寫方法的時候,不是呼叫基類的方法,而是呼叫成員變數的方法。

//好處在**呢?原來固定的多重繼承的順序才能實現的效果,經過包含乙個變數,並使用變數的方法來複寫。由固定變成了靈活的組合。

//最終1.裝飾類必須繼承被裝飾類2.建構函式需要傳遞乙個被裝飾類,並設定為成員變數。3複寫某個需要裝飾的方法時,呼叫型別是被裝飾類,而且是自己的成員變數的的方法,

//來代替基類。

public

class

addfire extends heightbsolider

}public

class

addfireplus extends heightbsolider

}public

abstract

class

absdecorator extends heightbsolider

@override

public

string showme()

}public

class

buff_fire extends absdecorator

public

string showme()

}public

class

buff_water extends absdecorator

public

string showme()

}public

void

run()

}

python裝飾器 python裝飾器完全指南之一

設我們有一組函式,它們有共同的錯誤處理方法,比如列印日誌和記錄審計資訊等。很顯然,在每乙個函式中都重複這些邏輯是不恰當的,它們應該被提煉到乙個函式裡,在這個函式的保護下,再呼叫我們的業務邏輯處理功能。儘管錯誤處理可能佔據 的主要部分,但業務邏輯才是程式的核心價值。因此,從 結構上看,錯誤處理應該處於...

設計模式 裝飾模式

裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...

設計模式 裝飾模式

剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...