1.模板方法模式是编程中经常用得到的模式,定义了一个操作中的算骨架,将某些步骤延迟到子类中实现。这样新的子类可以不改变一个算法结构的前提下重新定义该算法的某些步骤
2.核心:
处理某个流程的代码已经都具备,但是基中某个节点的代码暂时不能确定,因此采用工厂方法模式,将这个节点的代码实现转移给子类完成,即:处理步骤父类中定义好,具体实现延迟到子类中定义
3.方法回调(钩子方法)
在软件开发中,可以将call翻译为调用,子类中不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好,完全由父类控制整个过程。
4.开发中场景:
实现一个算法时,整体步骤很固定,但是某些部分易变,易变部分可以抽象成出来,供子类实同
-数据库访问的封装
-hibernate中的模板程序
-spring中JDBCTemplate,HibernateTemplate等
5.角色:
<1>抽象模板(Abstract Template):
-定义一个或多个抽象操作,以便让子类实现。这些抽象操作称为基本操作,它们是一个顶级逻辑的组成步骤
-定义并实现一个模板方法(用Final修饰,不允许子类修改),它给出了顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也可能会调用一些具体方法
<2>具体模板(Concrete Template)
-实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤
-每个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使顶级逻辑的实现各不相同
6.示例代码:
<1>抽象模板角色:
//抽象模板
public abstract class BankTemplate {
//具体方法
protected void takeTicket(){
System.out.println("取号");
}
//抽象方法
protected abstract void transact();
//具体方法
protected void evluate(){
System.out.println("评分");
}
//模板方法
public final void process(){
takeTicket();
transact();
evluate();
}
}
<2>客户端与具体模板角色:
//客户端
public class Client {
public static void main(String[] args) {
//匿名类实现具体模板角色
BankTemplate bt1=new BankTemplate() {
@Override
protected void transact() {
System.out.println("个人取钱");
}
};
bt1.process();
BankTemplate bt2=new BankTemplate() {
@Override
protected void transact() {
System.out.println("公司汇款");
}
};
bt2.process();
}
}
执行结果
取号
个人取钱
评分
取号
公司汇款
评分