Design Patterns in Android:模板方法模式

前言

今天給大家分享的是《設計模式Android篇:模板方法模式》。
其實有一定開發經驗的小夥伴已經不自覺的使用了模板方法了,今天將通過Android源碼和Android開發案例跟大家講解什麼是模板方法模式。
點擊此處查看《Design Patterns in Android》系列其他文章。

本文原創作者MichaelX(xiong_it),博客鏈接:http://blog.csdn.net/xiong_it,轉載請註明出處。

模板方式模式定義

模板方法模式(Template method pattern):定義一個操作中的算法框架,而將一些步驟延遲到子類中實現,使得子類可以不改變算法結構即可重新定義該算法的某些特定步驟

以上定義有兩個關鍵詞

  1. 算法框架:其本質是一個方法,也就是模板方法,它的調用會依次執行一些特定的步驟
  2. 特定步驟:其本質一系列抽象的方法,交由子類實現,以重新定義該算法細節

模板方法的UML類圖

模板方法的UML類圖

templateMethod:模板方法
methodA,methodB:特定步驟

模板方法示例代碼

基類

public abstract class AbstractClass {

    public void templateMethod() {
        methodA();

        methodB();
    }

    protected void abstract methodA();

    protected void abstract methodB();
}

子類


public class ConcreteClassA extends AbstractClass {


    @Override
    protected void abstract methodA() {
        System.out.println("ConcreteClassA.do something.");
    }

    @Override
    protected void abstract methodB() {
        System.out.println("ConcreteClassA.do other thing.");
    }
}


public class ConcreteClassB extends AbstractClass {


    @Override
    protected void abstract methodA() {
        System.out.println("ConcreteClassB.do something.");
    }

    @Override
    protected void abstract methodB() {
        System.out.println("ConcreteClassB.do other thing.");
    }
}

Android源碼中模板方法模式

在Android的api源碼中,給我們提供了一個執行異步任務的類AsyncTask,其用法d大致如下

  1. 寫一個自己的異步任務類(比如叫DownloadTask)繼承自AsyncTask,主要複寫onPreExecute(),doInBackground(),onPostExecute()等。
  2. 執行downloadTask

代碼如下

new DownloadTask().execute(url);

我們發現只要調用了execute(Params…)後,AsyncTask自動調用了各個回調方法了,onPreExecute(),doInBackground(),onPostExecute()等,其實這就是模板方法模式!下面我們通過一個android開發案例來弄懂模板方法。

Android開發中的模板方式模式實踐

Activity作爲四大組件之首,是我們經常要使用到的,除非你的app不用和用戶進行UI交互。
那在多個Activity中,我們通常在onCreate()做一些程序化的事情

  • 初始化控件
  • 獲取網絡/數據庫數據
  • 註冊事件監聽
  • 註冊廣播
  • 等等

在onDestroy()中

  • 反註冊廣播
  • 資源釋放等

這時我們通常可以使用模板方法模式來抽象出一個BaseActityBaseFragment類似,不展開分析。實例代碼如下

先寫一個基類BaseActity

public abstract class BaseActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initView();

        initData();

        initEvent();

        registerBroadcast();
    }

    /**
     * 初始化視圖控件
     */
    protected abstract void initView();

    /**
     * 初始化數據
     */
    protected abstract void initData();

    /**
     * 初始化點擊長按等事件
     */
    protected abstract void initEvent();

    /**
     * 註冊廣播接收者
     */
    protected void registerBroadcast() {
        // 子類可以選擇性複寫
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        unRegisterBroadcast();

        releaseMemory();
    }
    /**
     * 註銷廣播接收者
     */
    protected void unRegisterBroadcast() {
        // 子類可以選擇性複寫
    }

    /**
     * 做些釋放對象引用等其他操作以釋放內存
     */
    protected abstract void releaseMemory();
}

隨手寫一個實現類MyActivity

public class MyActivity extends BaseActivity {

    @Override
    protected void initView() {
        setContentView(resId);
        // TODO findViewById();
    }

    @Override
    protected void initData() {
        // TODO 訪問數據庫/網絡獲取數據
    }

    @Override
    protected void initEvent() {
        // TODO setOnClickListener
    }

    @Override
    protected void releaseMemory() {
        // TODO 把一些手動釋放的對象值設爲null
        someObj = null;// and so on.
    }
}

如果再有一個其他Activity代碼也是如此編寫,以BaseActivity的onCreate(),onDestroy()爲模板方法(算法框架),initView(),initData(),initEvent()等方法爲特定步驟,利用模板方法構建了一個較好的基類,子類無需修改BaseActivity的算法框架,不同的Activity只需複寫這些特定步驟即重新定義這些特定的細節步驟。

總結

看完這篇《Design Patterns in Android:模板方法》,是不是很多人恍然大悟,原來模板方法就是這樣啊!
當編寫一個方法時,其中包含了某些特定的步驟時,就可以考慮使用模板方法模式了。

好了,今天的《設計模式Android篇:模板方法》就到這裏,請繼續關注《Design Patterns in Android》(設計模式Android篇)系列博文,歡迎各位讀者朋友評論區拍磚交流,共同進步。

查看本文的最新版本,請進入:MichaelX’s Blog

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