模板方法模式用于固定相關(guān)操作的執(zhí)行流程,將具體實現(xiàn)延遲到子類中
該系列其他文章:
- 安卓設(shè)計模式(一)面向?qū)ο罅笤O(shè)計原則
- 安卓設(shè)計模式(二)單例模式
- 安卓設(shè)計模式(三)Builder模式
- 安卓設(shè)計模式(四)裝飾者模式
- 安卓設(shè)計模式(五)代理模式
- 安卓設(shè)計模式(六)策略模式
- 安卓設(shè)計模式(七)模板方法模式
- 安卓設(shè)計模式(八)工廠方法模式
定義: 定義一個操作中算法的框架,而降一些步驟延遲到子類中,使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟.
使用場景:
- 代碼重構(gòu)時,模板方法是經(jīng)常被用到的,將固定部分提取到父類中,具體實現(xiàn)則由子類負責
- 一系列操作總是有固定流程
- 多個子類擁有公共方法,且邏輯基本相同
實現(xiàn)舉例
在Android中,往往會有一些全局的基類,包括BaseActivity,BaseFragment等等,用于規(guī)范整個程序的View層的代碼風格,此時,即可充分運用到模板方法模式:
BaseActivity:
public abstract class IBaseActivity extends AppCompatActivity {
private SystemBarTintManager tintManager;
private int systemBarColor = R.color.colorPrimaryDark;//默認的狀態(tài)欄顏色
protected final EventBus mEventBus = EventBus.getDefault();//事件總線
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getArgs();
setContentView(initLayout());
initWindow(systemBarColor);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams
.SOFT_INPUT_STATE_HIDDEN);//解決Andriod軟鍵盤出現(xiàn)把原來的布局給頂上去的方法
ButterKnife.bind(this);
initView();
requestData();
}
/**
* 模板方法,用于返回布局ID
*/
public abstract int initLayout();
/**
* 模板方法,初始化View
*/
protected abstract void initView();
/**
* 模板方法,獲取數(shù)據(jù),執(zhí)行耗時操作
*/
protected abstract void requestData();
/**
* 提供給子類動態(tài)設(shè)置狀態(tài)欄顏色
*/
protected void setSystemBarColor(int colorId) {
initWindow(colorId);
}
//...省略一體化狀態(tài)欄處理
/**
* 該方法在onCreate中執(zhí)行,用于獲取Fragment的參數(shù)傳遞
* 子類可按情況自行選擇復(fù)寫
*/
protected void getArgs() {
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mEventBus.isRegistered(this)) mEventBus.unregister(this);
ButterKnife.unbind(this);//取消注入
}
}
使用:
public class TestActivity extends IBaseActivity {
@Override
public int initLayout() {
return 0;
}
@Override
protected void initView() {
}
@Override
protected void requestData() {
}
}
不難看出模板方法的兩個關(guān)鍵點:
- 父類中控制流程的方法定義為Final
- 父類中提供一系列子類可復(fù)寫的方法,從而將具體步驟中的實現(xiàn)延遲到子類中
從上面可以看出,BaseActivity
中的Oncrea()
方法被定義為Final
,所以子類是無法重寫的,這樣可以很好的避免子類復(fù)寫導(dǎo)致執(zhí)行流程被打亂.由于父類中流程已經(jīng)定義好,子類只需要負責具體實現(xiàn)的步驟即可,這樣代碼結(jié)構(gòu)非常清晰,且不容易出錯.
實際開發(fā)中可以多使用模板方法模式來進行上層結(jié)構(gòu)的封裝,固定操作流程,減少人為出錯,也便于閱讀.
關(guān)于作者
- 簡 書:uncochen
- github:ChenZhen
- 新浪微博:@Chen丶振
- Email:18620156376@163.com