概述

模板方法模式属于行为型模式。它由一个抽象类公开定义了执行它的方法的模板(执行的方式或顺序),它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。具体而言就是抽象类定义了某个方法的执行方式或者顺序,但是将该方法中的部分逻辑甚至全部逻辑实现交给具体的子类去实现,实现更高的抽象性。

模式中的角色

1、抽象类(AbstractClass):定义方法的模板,即方法的执行方式和顺序。

2、具体类(ConcreteClass):实现抽象类中的抽象方法,提供具体的执行逻辑。

应用举例

简单来说,比如我们去公司上班,我们将去上班这个行为定义为一个方法——prepareGotoWork()。假设大部分人去上班的步骤都可以分为四个步骤:穿衣服、吃早饭、带上东西和前往公司,但是不同的性别,不通的职工,在做这些具体的步骤的时候肯定采用不同的方式,比如男性和女性穿的衣服可能不同,普通职工和领导需要带的东西也不同,每个人前往公司的方式也不同,我们将这四个步骤分别定义为:dressUp()、eatBreakfast()、takeThings()和gotoCompany()这四个抽象方法,并交给子类去实现。抽象类和具体的实现子类代码如下:

public abstract class AbstractPerson {public void prepareGotoWork(){dressUp();eatBreakfast();takeThings();gotoCompany();}protected abstract void dressUp();protected abstract void eatBreakfast();protected abstract void takeThings();protected abstract void gotoCompany();
}
public class FemaleWorker extends AbstractPerson {@Overrideprotected void dressUp() {System.out.println("穿裙子");}@Overrideprotected void eatBreakfast() {System.out.println("吃燕麦片");}@Overrideprotected void takeThings() {System.out.println("带上化妆包");}@Overrideprotected void gotoCompany() {System.out.println("坐公交车");}
}
public class MaleWorker extends AbstractPerson {@Overrideprotected void dressUp() {System.out.println("穿T恤衫");}@Overrideprotected void eatBreakfast() {System.out.println("吃包子");}@Overrideprotected void takeThings() {System.out.println("带上电脑包");}@Overrideprotected void gotoCompany() {System.out.println("步行");}
}
public class Test {public static void main(String[] args) {FemaleWorker femaleWorker = new FemaleWorker();MaleWorker maleWorker = new MaleWorker();femaleWorker.prepareGotoWork();maleWorker.prepareGotoWork();}
}

可以看到FemaleWorker类和MaleWorker类分别对抽象类AbstractPerson类中的方法进行了重写,并采用该类中的方法prepareGotoWork对重写的方法进行调用。

总结

1、模板方法模式将方法中公用的部分逻辑或者代码顺序在父类(超类)中定义好,这样可以避免在具体实现的子类中重复的写同样的代码,就例子中的方法而言,如果公司提供班车服务,那么大家上下班都可以乘坐班车,那此时我们就可以在父类中实现gotoCompany方法,就不需要再在每个子类都重写gotoCompany方法了。

2、不同的子类可以实现不同的细节,提高了算法的扩展性。

3、我们可以在Test中将maleWorker和femaleWorker的声明为AbstractPerson类型,这样可以通过子类的具体实现扩展父类的行为。

JAVA设计模式——模板方法模式(Template Method Pattern)相关推荐

  1. 设计模式之模板方法模式(Template Method Pattern)

    模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...

  2. 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...

  3. 模板方法模式(Template Method Pattern)学习笔记

    模板方法模式可以所是最为常见的一种设计模式了,出乎很多人意料的是,很多人已经在他们的代码中用到了模板方法模式而没有意识到自己用到了这个模式,模板方法模式几乎可以在所有的抽象基类中找到. 通过模板方法模 ...

  4. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

    文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...

  5. 模板方法模式(Template Method Pattern)

    模板方法模式: (就是在抽象基类中定一个复用的方法!) 在一个方法中定一个算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以再不改变算法结构的情况下,重新定义算法中的某些步骤. 实例: 泡茶 ...

  6. Net设计模式实例之模板方法模式(Template Mothed Pattern)(1)

    一.模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不 ...

  7. JAVA设计模式(14) —行为型模板方法模式(Template Method)

    1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...

  8. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  9. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  10. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

最新文章

  1. arthas 排查内存溢出_【spark-tips】spark2.4.0触发的executor内存溢出排查
  2. NES模拟器开发-CPU笔记
  3. egg 自学入门demo分享
  4. 原来程序员在某个圈子还是蛮吃香的嘛~
  5. Apache-Guacamole windows11 远程控制
  6. 收藏老外的jquery web 按钮插件
  7. 寻找一个字符串中的最长不重复子串的长度
  8. 利用openpyxl,Python对excel读写文件
  9. 1.5 编程基础之循环控制 21 角谷猜想--方法二
  10. 慢慢人生路,学点Jakarta基础-深入剖析Java的接口和抽象类
  11. Python接口自动化之logging封装及实战
  12. iOS 控制器View加载顺序详细版
  13. php isnumber 小数点,JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】...
  14. 关于“绞刑架和职业发展”问题带来的思考
  15. Mac使用RDC远程连接Windows并传输文件
  16. iphone6s 10.2系统越狱及遇到的问题解决方案
  17. Java代码审计详解
  18. pytorch之日志模板logging
  19. qnx 设备驱动开发_一种QNX系统的USB驱动加载方法与流程
  20. 图像处理 抗锯齿放大_什么是抗锯齿,它如何影响我的照片和图像?

热门文章

  1. C语言刷题系列——12.判断回文字符串
  2. 感受程序员的浪漫情怀-Github婚恋项目精选
  3. python中openpyxl模块对excel的处理学习(一)新建工作簿,工作表的创建与命名
  4. 通过代码触发按钮点击事件
  5. Vue图片浏览组件v-viewer简单应用
  6. html picture元素
  7. 速冻食品崛起,飞速占领食品市场
  8. 分享奇葩的Google使用方法
  9. tableau数据可视化实战:大众点评成都美食(三)
  10. Unity3d用Animator实现鼠标控制多个门开关