引言
上一节我们说了抽象工厂模式,今天我们来说说"模板方法模式"。
示例地址
依然是先看类图
模板方法模式的定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使的子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景
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是一个典型的模板方法模式。