安卓設計模式(七)模板方法模式

模板方法模式用于固定相關操作的執(zhí)行流程,將具體實現(xiàn)延遲到子類中

該系列其他文章:

定義: 定義一個操作中算法的框架,而降一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟.
使用場景:

  • 代碼重構時,模板方法是經常被用到的,將固定部分提取到父類中,具體實現(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)設置狀態(tài)欄顏色
     */
    protected void setSystemBarColor(int colorId) {
        initWindow(colorId);
    }
    
    //...省略一體化狀態(tài)欄處理

    /**
     * 該方法在onCreate中執(zhí)行,用于獲取Fragment的參數(shù)傳遞
     * 子類可按情況自行選擇復寫
     */
    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() {

    }
}

不難看出模板方法的兩個關鍵點:

  • 父類中控制流程的方法定義為Final
  • 父類中提供一系列子類可復寫的方法,從而將具體步驟中的實現(xiàn)延遲到子類中

從上面可以看出,BaseActivity中的Oncrea()方法被定義為Final,所以子類是無法重寫的,這樣可以很好的避免子類復寫導致執(zhí)行流程被打亂.由于父類中流程已經定義好,子類只需要負責具體實現(xiàn)的步驟即可,這樣代碼結構非常清晰,且不容易出錯.

實際開發(fā)中可以多使用模板方法模式來進行上層結構的封裝,固定操作流程,減少人為出錯,也便于閱讀.

關于作者

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 目錄 本文的結構如下: 引言 什么是模板方法模式 模式的結構 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應用 一、引言 ...
    w1992wishes閱讀 896評論 0 3
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 4,073評論 1 15
  • 設計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,071評論 3 14
  • 中國到底多少個程序員?每年計算機專業(yè)畢業(yè)的有多少?而這些人中真正從事it行業(yè)的比例是多少呢?中國的程序員中的地域分...
    暖夏未眠丶閱讀 271評論 0 0

友情鏈接更多精彩內容