再談裝飾者模式(總結)
阿新 • • 發佈:2018-12-16
- 在之前的文章 淺談裝飾者模式+JAVA I/O中的裝飾者模式 中,淺談了一下裝飾者模式,這篇文章來總結一下裝飾者模式。
- 裝飾者模式遵循開放-關閉原則,即,類應該對擴充套件開放,對修改關閉;
- 用執行時擴充套件來取代編譯時繼承;
- 解決了繼承濫用的問題;
- 用物件組合的方式,做到在執行時裝飾類,能夠在不修改任何底層程式碼的情況下,給物件賦予新的職責。
- 儘管繼承威力強大,繼承並不總是實現最有彈性和最好維護的設計。
- 用組合和委託可以在執行時具有繼承行為的效果。
- 繼承設計子類的行為,是在編譯時靜態決定的,用組合的做法擴充套件物件的行為,可以在執行時
- 通過動態的組合物件,可以寫新的程式碼新增新功能,而無需修改現有程式碼。既然無需修改現有程式碼,那麼引進bug或產生意外副作用的機會將大幅度減少。即,滿足開放 - 關閉原則。
- 裝飾者和被裝飾者物件具有相同的超型別。所以在任何需要原始物件(被包裝者)的場合,可以用裝飾過的物件代替它。
- 可以用一個或多個裝飾者包裝一個物件。
- 裝飾者可以在被裝飾者的行為之前與 / 或之後,加上自己的行為,以達到特定的目的。
- 物件可以在任何時候被裝飾,所以可以在執行時動態地、不限量的用你喜歡的裝飾者來裝飾物件。
- 裝飾者模式:動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
- 裝飾者模式也用到了繼承,但是是利用繼承達到型別匹配,而不是利用繼承獲得行為。
- 因為裝飾者必須能取代被裝飾者,所以裝飾者需要和被裝飾者有相同的介面。
- 物件組合獲得新的行為,行為從哪裡來的呢?當我們將裝飾者與元件組合時,就是在加入新的行為,所得到的新的行為,並不是由繼承得自超類,而是由組合物件得來的。
- Java I/O也引出了裝飾者模式的一個“缺點”:利用裝飾者模式,常常造成設計中有很多小類,數量實在太多,可能會造成使用此API程式設計師的困擾。
- 裝飾者可以在被裝飾者的行為前面與/或後面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的。