1、什么是模板方法模式?
算法执行的统一框架(step1、step2……、stepn)。
父类定义了实现步骤的框架,然后子类可以在不改变父类框架的基础上增加或者修改父类的一些方法。
2、如何实现模板方法模式
以银行柜台办理业务为例实现模板方法模式。
流程可分为,取号->排队->办理业务->销号。
BankBusiness.java
/**
* 银行业务抽象类(抽象基类,为所有子类提供一个算法框架)
*/
public abstract class BankBusiness {
// final的模板方法,防止子类修改
final public void bankBusinessTemplate() {
// 调用各个流程方法
takeNo();
if (isSpecialUser()) {
queueUp();
}
handleBusiness();
destroyNo();
}
// 取号
private void takeNo() {
System.out.println("取号");
}
// 排队
private void queueUp() {
System.out.println("排队");
}
// 办理业务(定义为protected,在子类中延迟实现,提供个性化操作)
protected abstract void handleBusiness();
// 销号
private void destroyNo() {
System.out.println("销号");
}
// 钩子方法,有效调控公用变化的流程
protected boolean isSpecialUser() {
return true;
}
}
OpenNewCardBankBusiness.java
/**
* 办理新卡业务
*/
public class OpenNewCardBankBusiness extends BankBusiness {
@Override
protected void handleBusiness() {
System.out.println("柜台业务,办新卡");
}
}
destroyCardBankBusiness.java
/**
* 销卡业务
*/
public class destroyCardBankBusiness extends BankBusiness {
@Override
protected void handleBusiness() {
System.out.println("柜台业务,销卡");
}
}
BankBusinessTest.java
/**
* 测试类
*
*/
public class BankBusinessTest {
public static void main(String[] args) {
BankBusiness busi;
busi = new OpenNewCardBankBusiness();
busi.bankBusinessTemplate();
System.out.println();
busi = new destroyCardBankBusiness();
busi.bankBusinessTemplate();
}
}
运行结果
取号
排队
柜台业务,办新卡
销号
取号
排队
柜台业务,销卡
销号
准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。
3、模板方法模式的特点
优点
- 封装性好
- 复用性好
- 屏蔽细节
缺点:
每个不同的实现需要增加新类,类个数增多。
4、模板方法模式的适用场景
- 算法或操作逻辑相似的逻辑
- 重构时(把相同的代码抽取到父类中)
- 重要、复杂的算法,核心算法设计为模板算法