Android 模板方法模式
Android 設計模式系列文章Android 23種設計模式
前言
模板方法模式是一種我們十分常見的模式,比如我們都知道android中,Activity的生命週期,它都是固定的執行順序。當然還有Fragment,AsynTask等等,我們使用這些類的時候,它都有一個固定執行順序。而他們都是用了模板方法模式。我們自己多用於多個子類有公有方法的時候還有我們重構程式碼的時候。把相同的程式碼抽取到父類中。模板方法模式其實就是抽象類的一個使用
模板方法模式定義
定義一個框架,框架中所有方法按順序執行。使得子類不改變父類結構。有序的執行這些方法。
舉例
例子很簡單,能一目瞭然的讓我們知道什麼就是模板方法模式。
1、抽象了一個工作的例子
public abstract class Work { public Work() { goToWork(); goOffWork(); sleep(); } public abstract void goToWork(); public abstract void work(); public abstract void goOffWork(); public abstract void sleep(); }
新時代的我們就是這樣,兩點一線上下班。我抽象了四個方法,上班,工作,下班,睡覺。
2、實現具體的類
public class XiaoMing extends Work { static final String TAG = XiaoMing.class.getSimpleName(); @Override public void goToWork() { Log.d(TAG,"早上7點,去公安局上班"); } @Override public void work() { Log.d(TAG,"處理案件"); } @Override public void goOffWork() { Log.d(TAG,"下午6點,下班"); } @Override public void sleep() { Log.d(TAG,"晚上10點,睡覺"); } } public class XiaoDong extends Work{ static final String TAG = XiaoDong.class.getSimpleName(); @Override public void goToWork() { Log.d(TAG,"早上8點,去圖書館上班"); } @Override public void work() { Log.d(TAG,"整理圖書"); } @Override public void goOffWork() { Log.d(TAG,"下午6點,下班"); } @Override public void sleep() { Log.d(TAG,"晚上10點,睡覺"); } }
我們可以清楚的看到,程式碼執行的流程都一樣,根據模板來。goToWork-work-goOffWork-sleep這樣一個順序,子類無需改變這種架構,而可以實現自己的功能。
3、呼叫
XiaoMing xiaoMing = new XiaoMing(); XiaoDong xiaoDong = new XiaoDong();
輸出如下:
12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoMing: 早上7點,去公安局上班 12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoMing: 下午6點,下班 12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoMing: 晚上10點,睡覺 12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoDong: 早上8點,去圖書館上班 12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoDong: 下午6點,下班 12-03 10:13:36.267 28154-28154/com.yink.designpattern.designpattern D/XiaoDong: 晚上10點,睡覺
模板方法模式小結
模板方法模式很簡單,就是利用抽象類把流程梳理出來模板化。其實我們平時的使用過程中已經看到過很多很多這種用法了,只是沒有一個心中的概念。現在知道了模板方法模式過後,即可反應就是,哦,這就是模板方法模式。有興趣的同學可以去看看AysnTask,Activity等等的原始碼喔。
結束語
模板方法模式總結來就是流程封裝。能讓子類定製部分或者所有流程。父類提取共有程式碼,提升程式碼複用率,帶來更好的可擴充套件性。
優點:封裝不可變,擴充套件可變程式碼。提取公共程式碼便於維護
缺點:增加程式碼閱讀難度。有的時候變得不好理解。