Android設計模式之“組件協作模式”: 模板方法Template Method

HunBeane 8年前發布 | 8K 次閱讀 模板方法 Android開發 移動開發

GOF-23 模式分類

“目的”角度

  • 創建型(Creational)模式
    對象的部分創建工作延遲到子類或其他對象 ,從而應對需求變化給 對象創建時具體類型實現 引來的沖擊

  • 結構型(Structural)模式
    通過 類繼承 或者 對象組合獲 得更靈活的結構,從而應對需求變化給 對象的結構 帶來的沖擊

  • 行為型(Behavioral)模式
    通過 類繼承 對象組合 來劃分類與對象間的職責,從而應對需求變化給 多個交互的對象 帶來的沖擊

“范圍”角度

  • 類模式 處理 類與子類 的 靜態關系 (類關系是靜態的,寫好的代碼結構決定)

  • 對象模式 處理 對象 間的 動態關系 (對象關系是動態的,運行時具體情況而定)

從“封裝變化”角度進行模式分類

找穩定點和變化點的角度去理解運用設計模式

重構獲得模式 Refactoring to Patterns

  1. 面向對象設計模式是“好的面向對象設計”,所謂“好的面向對象設計”指的是可以滿足“ 應對變化,提高復用 ”的設計

  2. 現代軟件設計的特征是“需求頻繁變化”。設計模式的要點是“ 尋找變化點 ,然后 在變化點處應用設計模式 ,從而提高對需求變化的應對能力”。“ 什么時候、什么地點應用 設計模式”比“理解設計模式結構本身”更為重要。

  3. 設計模式的應用 不宜先入為主 ,一上來就使用設計模式是對設計模式的最大誤用。沒有一步到位的設計模式。敏捷軟件開發實踐提倡的“Refactoring to Patterns”是目前普遍公認的最好的使用設計模式的方法。

推薦書籍 -- 重構

重構中找到設計模式的最佳用法

重構的關鍵技法

  1. 靜態 ---> 動態

  2. 早綁定 ---> 晚綁定

  3. 繼承 ---> 組合

  4. 編譯時依賴 ---> 運行時依賴

  5. 緊耦合 ---> 松耦合

一、 “組件協作”模式

  • 大型軟件開發一般將“框架 --- 應用程序”劃分開來。“組件協作”模式通過晚期綁定,來實現框架與應用程序之間的 松耦合 ,是二者之間協作時常用的模式。
  • 典型模式
    1. Template Method (模板方法 模式)
    2. Strategy (策略 模式)
    3. Observer / Event (觀察者/事件 模式)

本篇筆記就講述“Template Method (模板方法 模式)”

Template Method 模板方法 模式

模式定義

定義某一操作的 算法骨架(穩定的) ,將一些不能立刻確定的 步驟(變化的) 延遲到子類中(定義為抽象方法,子類實現)。Template Method使得子類可以 不改變(復用) 一個 算法 的結構,即可 重定義(override 重寫) 該算法的某些特定步驟。

組成:

  1. 父類 + 算法(流程) + 抽象函數
  2. 子類 + 實現抽象函數 + 調用父類算法

模式結構(Structure)

類圖表示

動機 Motivation(針對的問題是什么)

  • 問題:軟件構建過程,對某一任務,有穩定不變的整體操作結構、流程,但有個別子步驟會根據需求改動,又或者其他固有原因(如框架和應用間的關系)無法和任務整體結構同時實現(類似于點擊事件的實現)

  • 要得到的結果:在確定穩定操作結構的前提下,靈活應對各個子步驟的變化或者晚期實現需求。

要怎么實現上述訴求呢?

把穩定的結構抽取出來,放到Library(框架)里面,把不穩定的子步驟(方法的實現)配置為抽象的(當應用程序使用到該庫的時候需要實現的),留給應用開發者去實現。

類似于Android中的點擊函數,如何獲取點擊事件并響應,這個操作流程肯定是穩定的,不需要我們操心,但是具體如何響應則是不穩定的,不同app的按鈕對應的意義操作不一,辣么就把響應方法設置為抽象的,讓我們去重寫實現即可。框架就可以在穩定的按鈕點擊事件流程中,適應不同的需求。

這就是把原有的結構化的程序設計,通過面向對象的程序設計進行改造,以得到更好的應對變化的特性。

程序開發人員也可以減少代碼量,因為穩定的結構已經被封裝在庫里面,我們只需要完成這個結構中不穩地的部分(實現其抽象方法)。

結構化設計流程

面向對象軟件設計流程

早綁定與晚綁定

早綁定:晚的類調用早的類(把早的類綁定到晚的類當中)

晚綁定:早的類調用晚的類(把晚的類綁定到早的類當中)

實現機制: 虛函數的多態調用 。因為函數是抽象的,會在晚的類中被實現(因為子類必須要實現父類的抽象方法),早的類中就會調用晚的類中的實現。

虛函數的多態調用

總結要點

  1. Template Method模式是常見的基礎性的設計模式,一般的面向對象程序都會大量的應用它。使用最簡潔的機制(虛函數多態性)為很多應用程序框架提供了靈活的 擴展點 ,是代碼復用方面的基本實現結構。

  2. 反向控制結構是Template Method的典型應用:“你別調用我,幫我實現那個方法就好,我來調用你,因為對整個流程你懂個屁”

  3. 在具體實現(運用)時,被Template Method調用的虛方法可以距有實現的,也可以是沒有任何實現(抽象方法、純虛方法),但一般推薦設置為 protected 方法(只有子類可以調用、重寫)。

 

來自:http://www.jianshu.com/p/f10a5b8f1f5d

 

 本文由用戶 HunBeane 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!