模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。
说白了,就是将一些相同操作的代码,封装成一个算法的骨架。核心的部分留在子类中操作,在父类中只把那些骨架做好。
***银行业务:***去银行办业务,银行给我们提供了一个模板就是:排对取号,办理业务(核心部分我们子类完成),反馈评分,完毕。
以银行办理业务为例实现模版方法模式
首先,定义一个模板。模板中把办理业务用作核心部分,让子类或者是使用匿名内部类来实现。
public abstract class BankTemplate {
// 去银行办业务,银行给我们提供了一个模板就是:排对取号,,办理业务(核心部分我们子类完成),反馈评分,完毕。
// 取号排队
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();
}
}
public class BankTemplateImpl extends BankTemplate{
@Override
public void transact() {
System.out.println("办理业务");
}
}
使用匿名内部类测试
public class Test {
public static void main(String[] args) {
BankTemplate bankTemplate = new BankTemplate() {
@Override
public void transact() {
System.out.println("办理业务");
}
};
bankTemplate.process();
}
}
使用实现类测试
public class BankTemplateImpl extends BankTemplate{
@Override
public void transact() {
System.out.println("办理业务");
}
}
输出结果:
排队取号
办理业务
反馈评分
什么时候用模板方法模式?
实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分容易变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。