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("我要存钱!!"); } }
实现结果如下
如有错误,欢迎指正
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)