基本要点
1、核心
处理步骤父类中定义好,具体步骤延迟到子类中定义
2、介绍
模板方法定义了一个操作中的算法骨架,将某些步骤延迟到子类中去定义,这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤
3、举例
我们请客去吃饭,大概流程就是取号—–点菜——买单
但是点菜这个环节我们要等拿到菜单才能决定具体要点什么,所以我们先定义一个点菜的操作,等到了饭馆再决定点烧烤还是点火锅
4、开发中常用场景
实现一个算法,如果存在整体步骤比较固定,某些部分易变,那我们就可以把易变部分抽象出来,供子类实现
例如Junit单元测试、数据库访问的封装(是访问Oracle还是Mysql)、servlet中关于doGet、doPost方法的调用
代码样例
我们举一个去银行办理业务的例子,我们可以去取钱,也可以去存钱
但是我们的大体流程都是:取号——办业务——评分
所以我们可以把办业务这个方法定义成钩子方法
public abstract class BankTemplate {
public void takeNumber() {
System.out.println("取号排队");
}
public abstract void transact();
public void evaluate() {
System.out.println("服务打分");
}
// 模板方法,把基本操作组合到一起,定义为final,子类无法重写
public final void process() {
this.takeNumber();
// 钩子方法,执行时,挂在哪个子类下就调用哪个方法
this.transact();
this.evaluate();
}
}
然后我们想要办理哪种业务,直接指向子类对象,实现该钩子方法即可
public class Client {
public static void main(String[] args) {
BankTemplate saveMoney = new SaveMoney();
saveMoney.process();
// 也可以通过匿名内部类来进行调用
BankTemplate takeMoney = new BankTemplate() {
@Override
public void transact() {
System.out.println("我要取钱!!");
}
};
takeMoney.process();
}
}
class SaveMoney extends BankTemplate {
@Override
public void transact() {
System.out.println("我要存钱!!");
}
}
实现结果如下
如有错误,欢迎指正
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136804.html