裝飾器模式

     面向對象通過繼承,可是使我們擴展已有類的功能。所以在面向對象的開發中一遇到這種情況(原有類的功能不能滿足要求或者要在原有類的基礎上擴展一些額外的功能),通常的想法就是通過繼承方法來實現現有類的額外功能。這種方法通常是可行的,但是有時卻是不合適的。

    當我們想改變一個已經初始化對象的行爲,我們不能通過繼承方法來實現這個功能;當我們想對一族子類(從同一個父類繼承而來)擴展類似的功能。我們可以通過繼承來時實現,但是這樣就會來帶更多的子類而這有時候會帶來子類爆炸。

    我們該如何組織我們的代碼使其可以容易的添加基本的或者一些很少用到的特性,而不是直接把額外的代碼寫在類的內部?

     對上述問題很適合的解決方案就是裝飾器模式。裝飾器模式能實現動態的改變子類的行爲或添加子類特性。
     假如我們有一個TextInput類,類中有一個paint功能(渲染出文本輸入框讓用戶輸入)。一開始這個類的paint功能只是簡單的輸出輸入框。現在我們要增加paint的功能,在輸出輸入框的同時在輸入框的左邊同時顯示一個提示label(提示這個輸入框應該輸入什麼內容比如:名字還是E- mail),我們可以再寫一個TestInputWithLabel類繼承自TextInput類然後重載paint功能。然而當我們再要實現一個功能:當TextInput控件中輸入的內容不符合要求的時候,他的顯示樣式就要顯示成具有提示你輸入的數據是錯誤的Label+TextInput,這時我們又增加一個InvalidTextInputWithLabel類。。。這樣子類數量將變的更多而且如果其他的控件也以這樣的形式來處理問題的話,那子類的數量將變得可想而知了。

     而用裝飾模式的話我們可以生成一個容器類,用來容納要處理的控件對象。而且這個容器擁有將要處理對象一樣的功能接口函數paint。這樣我們在容器裝載不同的對象的後,條用同樣功能paint將更具包含的不同對象就行特殊功能。

發佈了29 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章