一句话定义
定义操作的算法框架,将具体实现步骤延迟到子类实现,使得子类可以不改变结构算法而改变特定的步骤。
使用场景
1. 多个子类含有相同逻辑方法,能够提出
2. 重要、复杂算法,提出成模版模式
实现要点
1. 具体流程方法抽象出来
2. 流程操作定义为final方法,杜绝子类操作
情景假设
把大象放入冰箱,分为几个步骤?
实现步骤
1. 创建放入冰箱模版,规定执行步骤以及顺序
/**
* 模版抽象类
* 定义具体的流程方法,final的流程执行方法
* * @author fengzhen
* @version 1.0, 2017/2/14
*/
public abstract class Template {
/**
* 打开冰箱
*/
abstract void openIcebox();
/**
* 放入大象
*/
abstract void putIn();
/**
* 关上冰箱
*/
abstract void closeIcebox();
/**
* 动作
*/
abstract void action();
/**
* 顺序执行动作,final禁止修改流程
*/
public final void putInSomething(){
openIcebox();
putIn();
closeIcebox();
action();
}
}
2. 创建具体的放入类,具体实现每个步骤
- 大象放入类
/**
* 把大象放入冰箱
* * @author fengzhen
* @version 1.0, 2017/2/14
*/
public class ElephantPut extends Template{
@Override
void openIcebox() {
Log.i("info", "openIcebox: ==++打开冰箱!");
}
@Override
void putIn() {
Log.i("info", "putIn: ==++放入大象!");
}
@Override
void closeIcebox() {
Log.i("info", "closeIcebox: ==++关上冰箱!");
}
@Override
void action() {
Log.i("info", "action: ==++哈哈哈!!!");
}
}
小明放入类
/**
* 把小明放入冰箱
*
* @author fengzhen
* @version 1.0, 2017/2/14
*/
public class XiaoMingPut extends Template{
@Override
void openIcebox() {
Log.i("info", "openIcebox: ==++打开冰箱!");
}
@Override
void putIn() {
Log.i("info", "putIn: ==++放入小明!");
}
@Override
void closeIcebox() {
Log.i("info", "closeIcebox: ==++关上冰箱!");
}
@Override
void action() {
Log.i("info", "action: ==++呃。。。。");
}
}
3. 放入大象,小明
// 模版模式
ElephantPut elephantPut = new ElephantPut();
elephantPut.putInSomething();
XiaoMingPut xiaoMingPut = new XiaoMingPut();
xiaoMingPut.putInSomething();