前言
模板方法模式是一種我們十分常見的模式,比如我們都知道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等等的源碼喔。
結束語
模板方法模式總結來就是流程封裝。能讓子類定制部分或者所有流程。父類提取共有代碼,提升代碼復用率,帶來更好的可擴展性。
優點:封裝不可變,擴展可變代碼。提取公共代碼便于維護
缺點:增加代碼閱讀難度。有的時候變得不好理解。