背景

在开发中,你肯定有遇到过这样一种场景:你知道某个方法的关键步骤以及执行顺序,但是里面有的具体步骤并清楚。你会怎么做?

比如你早上起床到公司,我们分解步骤:

“起床洗漱吃早餐乘坐交通工具到公司”

我们已经确定这个步骤了,但是不同的人里面的细节可能会不一样。比如小明早餐吃的面包,小张吃的面条。小美坐的地铁,小花坐的公交。

再举个例子,我们平时写简历会用到简历模板,不同的人写的内容不一样,模板一样。

模板方法模式是这样定义的:

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

这个定义看的云里雾里,我们直接代码来演示。

在写代码之前我们需要了解实现模板方法模式需要存在几个要素:

“抽象类:定义一个算法的基本骨架,需要有一个模板方法和多个基本方法具体类:实现抽象类中定义的抽象方法”

那么什么是模板方法呢?模板方法定义了算法骨架,并且包含了算法的执行顺序。

而基本方法为算法中的一个步骤,需要实现或重写它。用于扩展。结构如下:

模板方法的代码实现

首先创建一个抽象类:

public abstract class AbstractClass {    //模板方法    public void templateMethod() {        specificMethod();        abstractMethod1();        abstractMethod2();    }    //具体方法    public void specificMethod() {        System.out.println("抽象类中的具体方法被调用...");    }    public abstract void abstractMethod1(); //抽象方法1    public abstract void abstractMethod2(); //抽象方法2}

这里面定义了模板方法,具体方法,抽象方法。模板方法里面包含了具体方法,和抽象方法。

具体的子类:

public class ConcreteClass extends AbstractClass {    @Override    public void abstractMethod1() {        System.out.println("抽象方法1的实现被调用...");    }    @Override    public void abstractMethod2() {        System.out.println("抽象方法2的实现被调用...");    }}

这个子类继承了抽象类,里面实现了抽象方法。

测试代码如下:

public class TemplateMethodPattern {    @Test    public void test() {        AbstractClass tm = new ConcreteClass();        tm.templateMethod();    }}

我们调用模板方法,得到如下信息:

抽象类中的具体方法被调用...抽象方法1的实现被调用...抽象方法2的实现被调用...

关于模板方法模式的思考

从上面代码我们发现,模板方法templateMethod()的整体步骤是固定的,变的是具体方法和抽象方法里面的内容。我们通过对于抽象方法和具体方法,我们都可以通过继承方式去修改内容。

当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

我认为模板方法有以下几个好处:

  • 将不会变动的部分算法封装到父类实现,可变的部分通过继承来扩展。
  • 将同类的方法提取为公共的,也便于维护。
  • 父类控制行为,子类实现扩展。

所以当你在设计时,重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个 子类实现。

设计一个扩展自抽象类geometricobject_设计模式4之模板方法模式相关推荐

  1. 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...

    (1) 定义 一个软件实体(类.模块.函数等),对于扩展是开放的,对于更改是封闭的. 对于扩展是开放的:这意味着模块的行为是可以扩展的.当应用的需求发生改变时,我们可以对模块进行扩展,比如增加新的类或 ...

  2. 设计一个扩展自抽象类geometricobject的新的triangle类_如何进行代码抽象设计?

    如何写好一段代码?直接CRUD.if-else.for.一个大方法等实现,从完成任务的角度来说没任何问题,但是会遇到一些问题,例如:后续写个新逻辑又得重新开发,而且代码相似度很高:想添加一个额外的功能 ...

  3. 设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)

    C++ 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至 ...

  4. php设计一个盒子类代码_PHP设计模式之简单工厂模式(Simple Factory)代码实例大全(七)...

    目的[1] 简单工厂模式是一个精简版的工厂模式. 它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟(Mock)它,这对编写可 ...

  5. 设计模式读书笔记-----模板方法模式

    首先我们先来看两个例子:冲咖啡和泡茶.冲咖啡和泡茶的基本流程如下: 所以用代码来创建如下: 咖啡:Caffee.java public class Coffee {void prepareRecipe ...

  6. 咖啡泡JAVA_java《Head First 设计模式》之模板方法模式——冲泡咖啡和茶

    <Head First 设计模式>之模板方法模式--冲泡咖啡和茶 模板方法模式(Template) 在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  7. 设计模式(十):模板方法模式

    目录 1.整体框架 2.介绍 2.1.定义 2.2.作用 2.3.解决的问题 3.认识模版方法模式 3.1.变与不变 3.2.好莱坞法则 3.3.对设计原则的体现 4.模式原理 4.1.UML类图 & ...

  8. Java设计模式系列之——模板方法模式

    大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...

  9. Java设计模式9,模板方法模式

    目录 一.模板方法模式 二.模板方法模式的结构 三.模板方法模式的优缺点 1.优点 2.缺点 四.模板方法模式的使用场景 五.通过模板方法模式实现 抽象类WorkDay 1.顶级抽象类 2.项目经理的 ...

最新文章

  1. 协整检验r语言代码_R语言学习笔记(一):时间序列分析
  2. 协议处理程序初始化失败_TCP协议、算法和原理
  3. canpro脚本_AE/PR脚本-创建编辑导入导出专业字幕脚本 Subtitle Pro 2.8.0 + 使用教程...
  4. CSDN挑战编程——《数学问题》
  5. android xml黑体字_如何在 Android 上使用思源黑体作为系统字体?
  6. memcached的缺点
  7. Oracle database sqldeveloper study(1)
  8. 关于在mysql和oracle中编码对varchar等类型的影响
  9. 弘辽科技:开庭了辛巴被诉“永久封号”
  10. SI4463 空中唤醒教程
  11. 颠覆式创新看世界,读《第二曲线创新》有感
  12. BF-9500警用(PDT)数字集群通信系统
  13. 海风的Linux开发环境介绍
  14. 基于Python的二分法求平方根
  15. Ubuntu虚拟机下载app网速太慢
  16. 码率,帧率,分辨率_详解
  17. 父母不会用智能机?这几个功能可要教会他们
  18. xmanager使用教程
  19. RBP as a streaming server(一)
  20. SQL级联表树形(三)

热门文章

  1. Java静态代理、动态代理以及CGLIB动态代理
  2. C++语言虚函数表实现多态原理
  3. Android给scrollView截图超过屏幕大小形成长图
  4. Android4.2 Input子系统
  5. vscode之npm不是内部活外部命令
  6. slice 和splice 的区别 js
  7. yarn 常用命令(干干货!)
  8. 3h精通OpenCV(一)- 读取图像视频与网络摄像头
  9. 自定义完整安装rhel7_服务器系统Windows Server 2008 R2安装教程
  10. torch报告_Stack Overflow 2020调查报告发布,Rust 5连冠