1 Template Pattern 模板模式

目的:一个抽象类公开定义了执行它的方法的方式/模板,让它的具体实现在子类中进行;
实现:关键逻辑在抽象类实现,其他步骤在子类实现。

1.该模式的场景:1)分工协作,2)公共代码和个性化代码分离 等;
2.在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果;
3.为防止恶意操作,一般模板方法都加上 final 关键词。

2 实现

代码场景:莲湖公园中有很多儿童玩的给石膏娃娃上色的摊位。
石膏雕塑已经被老板做好,但上色这个任务就交给了各个小盆友。

2.1 代码实现

小猪佩奇石膏雕塑抽象类

public abstract class AbstractPlasterSculpture {public final void show() {//生产模型雕塑productPlasterSculpture();//給模型上色coloring();}public void productPlasterSculpture(){  System.out.println("找些薄的铁皮来,沿着泥塑的高点把铁片插进去"); System.out.println("把石膏粉或水一遍一遍的洒在泥塑上面"); System.out.println("等干了以后,把在插片处一点一点把几半石膏模分开"); System.out.println("在石膏模具里面加点钢筋,缠上麻丝"); System.out.println("干了以后再用凿子把磨具敲碎,这样一个石膏雕塑出炉了"); }//给雕塑上色 子类来实现 不同的儿童不同的实现public abstract void coloring();
}

具体实现类:涂成红色的小猪佩奇

public class RedPeiQi extends AbstractPlasterSculpture {@Overridepublic void coloring() {System.out.println("将小猪佩琦雕塑涂成了红色");}}

具体实现类:涂成黑色的小猪佩奇

public class BlackPeiQi extends AbstractPlasterSculpture {@Overridepublic void coloring() {System.out.println("将小猪佩琦雕塑涂成了黑色");}}

2.2 涉及角色

(1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

(2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

模式实现
在实现模板方法模式时,开发抽象类的软件设计师和开发具体子类的软件设计师之间可以进行协作。一个设计师负责给出一个算法的轮廓和框架,另一些设计师则负责给出这个算法的各个逻辑步骤。实现这些具体逻辑步骤的方法即为基本方法,而将这些基本方法汇总起来的方法即为模板方法,模板方法模式的名字也因此而来。

基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

(1) 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。
(2)具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
(3) 钩子方法:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用 virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现。

在模板方法模式中,钩子方法有两类:第一类钩子方法可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是 boolean 类型的,这类方法名一般为 IsXXX(),用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行,如下代码片段所示:

……
//模板方法
public void TemplateMethod()
{Open();Display();//通过钩子方法来确定某步骤是否执行if (IsPrint()) {Print();}
}//钩子方法
public bool IsPrint()
{return true;
}
……

在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。

2.3 调用

调用者:

public class Client {public static void main(String[] args) {AbstractPlasterSculpture redPeiQi = new RedPeiQi();redPeiQi.show();System.out.println("------------------制作完毕-------------------");AbstractPlasterSculpture blackPeiQi = new BlackPeiQi();blackPeiQi.show();System.out.println("------------------制作完毕-------------------");}
}

结果:

找些薄的铁皮来,沿着泥塑的高点把铁片插进去
把石膏粉或水一遍一遍的洒在泥塑上面
等干了以后,把在插片处一点一点把几半石膏模分开
在石膏模具里面加点钢筋,缠上麻丝
干了以后再用凿子把磨具敲碎,这样一个石膏雕塑出炉了
将小猪佩琦雕塑涂成了红色
------------------制作完毕-------------------
找些薄的铁皮来,沿着泥塑的高点把铁片插进去
把石膏粉或水一遍一遍的洒在泥塑上面
等干了以后,把在插片处一点一点把几半石膏模分开
在石膏模具里面加点钢筋,缠上麻丝
干了以后再用凿子把磨具敲碎,这样一个石膏雕塑出炉了
将小猪佩琦雕塑涂成了黑色
------------------制作完毕-------------------

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

Java设计模式--模板模式相关推荐

  1. Java设计模式-模板模式

    Java设计模式-模板模式 什么是模板模式? 模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义模板,我们的剩余工作就是对其进行充实. ...

  2. 【设计模式】Java设计模式 - 模板模式

    [设计模式]Java设计模式 - 模板模式

  3. Java设计模式—模板模式(Template)

    模板模式 业务需求 编写豆浆制作程序 选材-添加配料-浸泡-豆浆机打碎 选材.浸泡.打碎这几步对于制作不同豆浆都是一样的 比较简单,这里不再使用传统方法,直接上设计模式 模板模式基本介绍 模板模式,在 ...

  4. java设计模式————模板模式,手撸一个JDBCTemplate

    模板模式(Template Method Pattern) 定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现. 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 属于行为 ...

  5. Java设计模式 - 模板模式

    目录 模板模式: 模板优点: 模板模式应用: 模板模式和策略模式区别: 模板实例: 上述代码 GitHub 地址:https://github.com/baicun/designPatterns 模板 ...

  6. Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

    Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一.概述 模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现. 本文将以一个通 ...

  7. Java设计模式-模板方法模式详解

    Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...

  8. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  9. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  10. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

最新文章

  1. SpringBoot源码分析之@Scheduled
  2. python向量化编程_向量化编程思维。
  3. 地址做域名时不能加端口_当你访问XXX网站时,从访问到内容返回呈现,中间发生了什么?...
  4. Oracle 10G DataGuard搭建
  5. RocketMQ的存储之消息的存储分析
  6. SMTP、POP3、IMAP的区别
  7. php的冒泡算法,PHP实现冒泡算法
  8. PTA-基础编程题目集-函数题 ……
  9. linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
  10. java程序设计 论文_《JAVA程序设计》论文要求
  11. Android启动过程概述
  12. 华硕win10键盘失灵_华硕键盘失灵一键修复的方法_win10华硕快捷键失灵的解决方法...
  13. W10虚拟机一开机电脑蓝屏重启
  14. 山重水复疑无路,分库分表来敲门
  15. sonar打包出现的问题The forked VM terminated without saying properly goodbye. VM crash or System.exit called
  16. 2022高教杯思路 数模思路
  17. Xml字符串转Map
  18. OPENGLES 绘制纹理带黑圈pre-multiplying
  19. 成为人工智能产品经理需要具备哪些能力?
  20. Libra发展路线图一文解读

热门文章

  1. 基于html,css背景平面图片暗格的应用
  2. Python金融量化交易之Tushare多线程拉取股市信息
  3. zz-u-boot-2014.04三星210A8板示例分析141124b
  4. 支付宝小程序页面逻辑处理之事件(onTap,onTouchStart,onTouchMove,onTouchEnd)
  5. 年度经济人物该挺一下新浪曹国伟
  6. 扩展Playwright自动等待方法
  7. “控制情绪,理性交流”刍议
  8. ORA-01033: ORACLE initialization or shutdown in progress错误正解
  9. ppi 各代iphone_iOS设备型号以及PPI大全
  10. 安装ECC EHP6 on Windows Server 2008