什么是模板方法模式?
模板方法模式是编程中经常用得到的模式。它定义了一个操作的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。
核心
处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用模板方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类定义号,具体实现延迟到子类中定义。
什么时候用到模板方法模式
实现一个算法时,整体步骤很固定。但是,某些部分易变,易变部分可以抽象出来,供子类实现。
开发中常见的场景
- 数据库访问的封装。
- Juint单元测试。
- servlet中关于doGet/doPost方法调用。
- hibernate中模板程序。
- spring中JDBCTemplate,HibernateTemplate等。
场景
客户到银行办理业务:
- 取号排队。
- 办理具体现金/转账/企业/个人/理财业务。
- 给银行工作人员评分。
代码
package com.match.templateMethod;
public abstract class BankTemplateMethod
{
public void takeNumber()
{
System.out.println("取号排队");
}
//办理具体的业务,钩子方法
public abstract void transact();
public void evaluate()
{
System.out.println("反馈评分");
}
/**
* 模板方法
*/
public final void process()
{
this.takeNumber();
this.transact();
this.evaluate();
}
}
package com.match.templateMethod;
public class Client
{
public static void main(String[] args)
{
System.out.println("---采用子类继承父类方式---");
BankTemplateMethod btm = new DrawMoney();
btm.process();
//采用匿名内部类
System.out.println("---采用匿名内部类方式---");
BankTemplateMethod btm2 = new BankTemplateMethod()
{
@Override
public void transact()
{
System.out.println("我要存钱!");
}
};
btm2.process();
}
}
class DrawMoney extends BankTemplateMethod
{
@Override
public void transact()
{
System.out.println("我要取款!");
}
}
测试输出
---采用子类继承父类方式---
取号排队
我要取款!
反馈评分
---采用匿名内部类方式---
取号排队
我要存钱!
反馈评分