1. 程式人生 > >再談裝飾者模式(總結)

再談裝飾者模式(總結)

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