引言
??上一節我們說了抽象工廠模式,今天我們來說說"模板方法模式"。
示例地址
??Demo
依然是先看類圖
image
模板方法模式的定義
??定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使的子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
使用場景
??1. 多個子類有公有的方法,并且邏輯基本相同時。
??2. 重要、復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節功能則有各個子類實現。
??3. 重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數約束其行為。
模板方法模式示例
??每到年底,在北京的外地人都要回家,很多人選擇做火車回家,也有選擇坐飛機回去的。但是他們都經歷同樣的過程。買票、上車(登機)、下車、回家。
1. 首先,我們來寫基類
/**
* 春節回家的基類
*
* @author 512573717@qq.com
* @created 2018/7/10 下午3:03.
*/
public abstract class BaseGoHome {
//選擇出行方式
public abstract void travelWay();
//買票
public abstract void buyTicket();
//上車
public abstract void shangche();
//下車
public abstract void xiache();
}
2. 看看老王怎么回家的
/**
* 老王回家
*
* @author 512573717@qq.com
* @created 2018/7/10 下午3:11.
*/
public class LaoWang extends BaseGoHome {
@Override
public void travelWay() {
System.out.println("選擇做火車回家");
}
@Override
public void buyTicket() {
System.out.println("去火車站買票");
}
@Override
public void shangche() {
System.out.println("在候車室檢票進站");
}
@Override
public void xiache() {
System.out.println("下車 做公交回家");
}
}
3. 在看看小明的
/**
* 小明回家
*
* @author 512573717@qq.com
* @created 2018/7/10 下午3:10.
*/
public class XiaoMing extends BaseGoHome {
@Override
public void travelWay() {
System.out.println("選擇做飛機回家");
}
@Override
public void buyTicket() {
System.out.println("在網上買提前訂票");
}
@Override
public void shangche() {
System.out.println("換登記牌 登機");
}
@Override
public void xiache() {
System.out.println("打車回家");
}
}
4. 具體運用
System.out.println("小明春節回家");
BaseGoHome xiaoming = new XiaoMing();
xiaoming.travelWay();
xiaoming.buyTicket();
xiaoming.shangche();
xiaoming.xiache();
System.out.println("老王春節回家");
BaseGoHome laowang = new XiaoMing();
laowang.travelWay();
laowang.buyTicket();
laowang.shangche();
laowang.xiache();
總結
??模板方法模式,我們用的應該是比較多的,例如BaseActivity、BaseFragment。Android源碼的Activity是一個典型的模板方法模式。