前言
今天給大家分享的是《設計模式Android篇:模板方法模式》。
其實有一定開發經驗的小夥伴已經不自覺的使用了模板方法了,今天將通過Android源碼和Android開發案例跟大家講解什麼是模板方法模式。
點擊此處查看《Design Patterns in Android》系列其他文章。
本文原創作者MichaelX(xiong_it),博客鏈接:http://blog.csdn.net/xiong_it,轉載請註明出處。
模板方式模式定義
模板方法模式(Template method pattern):定義一個操作中的算法框架,而將一些步驟延遲到子類中實現,使得子類可以不改變算法結構即可重新定義該算法的某些特定步驟
以上定義有兩個關鍵詞
- 算法框架:其本質是一個方法,也就是模板方法,它的調用會依次執行一些特定的步驟
- 特定步驟:其本質一系列抽象的方法,交由子類實現,以重新定義該算法細節
模板方法的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大致如下
- 寫一個自己的異步任務類(比如叫DownloadTask)繼承自AsyncTask,主要複寫onPreExecute(),doInBackground(),onPostExecute()等。
- 執行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。