博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之模板方法模式(Template)
阅读量:4701 次
发布时间:2019-06-09

本文共 1404 字,大约阅读时间需要 4 分钟。

一、介绍


模板方法模式是编程中经常用到的模式。它定义了一个操作中的骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。

二、场景举例


当一个客户到银行办理业务时,有以下流程:

  • 1.取号排队
  • 2.办理具体现金/转账/企业/理财业务
  • 3.给银行工作人员评分

这时办理业务的一个标准流程,其中一三步是确定的,而第二步往往并不确定只有等到到窗口办理业务时才能知道到底要办什么业务。

根据以上场景可以总结出:   模板方法模式,即处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此采用模板方法模式,将这个节点的代码实现转移给子类去完成。即:处理步骤父类已经定义好了,具体实现延迟到子类中去定义。

三、模式结构


结构类图:

这里写图片描述

  • AbstractClass抽象类:定义了算法的流程骨架,并实现了模板方法。
  • ConncreteClass具体类:实现抽象类,重现待实现的方法完成具体流程。

示例代码:AbstractClass抽象类:

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(); } }

ConncreteClass具体类:

public class TakeMoney extends BankTemplateMethod{ @Override public void transact() { System.out.println("取现金业务"); } }

客户端:

public class Client {    public static void main(String[] args) { BankTemplateMethod btm=new TakeMoney(); btm.process(); } } //输出结果 取号排队 取现金业务 反馈评分

上述回调方法又称为钩子方法

  • 满足好莱坞原则:“Don’t call me,We’ll call you”,在软件开发中,我们可以将call翻译为调用。子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好了,完全由父类控制整个过程。

四、总结


  • 使用场景:实现一个算法是,整体步骤很固定。但是,某些部分易变。易变部分可以抽象出来,供子类去实现。
  • 优点:
    • 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
    • 子类实现算法的某些细节,有助于算法的扩展。
    • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
  • 缺点: 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

转载于:https://www.cnblogs.com/xbzhu/p/6774305.html

你可能感兴趣的文章
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>