文章目录

  • 饺子制作的过程
  • 普通方法做饺子
  • 模板方法做饺子
  • 总结

饺子制作的过程

小帅在外奔波多年,厌倦了程序员的生活,终于决定回老家安定下来,开了个饺子馆,天天下饺子。

小帅跟一个大厨苦练饺子制作,自己总结了一下饺子制作的过程:

擀面皮
包馅
水煮
出锅
加基本调料
加其他调料(顾客自行添加)

小帅就以这个流程为模板,在店里做各种各样的饺子,恩,生意还挺好的。

普通方法做饺子

小帅发挥程序员的特长,把做饺子的经过用代码写了下来,其实很简单:

制作韭菜馅饺子

/*** 韭菜馅饺子*/
public class LeekDumpling {/*** 做饺子*/public void makeDumpling() {// 擀面皮ganMianPi();// 包馅baoXian();// 水煮shuiZhu();// 出锅chuGuo();// 加基本调料jiaJiBenTiaoLiao();// 加其他调料jiaQiTaTiaoLiao();}// 擀面皮public void ganMianPi() {System.out.println("擀面皮");}// 包馅public void baoXian() {System.out.println("包韭菜馅");}// 水煮public void shuiZhu() {System.out.println("水煮8分钟");}// 出锅public void chuGuo() {System.out.println("出锅");}// 加基本调料public void jiaJiBenTiaoLiao() {System.out.println("加醋");}// 加其他调料public void jiaQiTaTiaoLiao() {}
}

制作猪肉馅饺子

/*** 猪肉馅饺子*/
public class PorkDumpling {/*** 做饺子*/public void makeDumpling() {// 擀面皮ganMianPi();// 包馅baoXian();// 水煮shuiZhu();// 出锅chuGuo();// 加基本调料jiaJiBenTiaoLiao();// 加其他调料jiaQiTaTiaoLiao();}// 擀面皮public void ganMianPi() {System.out.println("擀面皮");}// 包馅public void baoXian() {System.out.println("包猪肉馅");}// 水煮public void shuiZhu() {System.out.println("水煮10分钟");}// 出锅public void chuGuo() {System.out.println("出锅");}// 加基本调料public void jiaJiBenTiaoLiao() {System.out.println("加醋");}// 加其他调料public void jiaQiTaTiaoLiao() {System.out.println("加重辣");}
}


小帅的店里不仅有韭菜馅饺子,猪肉馅饺子还有牛肉馅,蘑菇馅,海鲜馅饺子等等十几种呢,各种饺子的制作过程其实都是大同小异,主要是包的馅不一样,然后就水煮的时间不一样。

如果每种饺子都各自实现一次所有的代码,会出现大量的重复代码,该怎么改进呢?

模板方法做饺子

其实每种饺子的制作都是按固定的流程制作的,这种情况就非常适合使用模板方法模式。

模板方法模式定义如下:模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。

类图如下:

按照模板方法模式改造一下:

饺子抽象类

public abstract class Dumpling {/*** 做饺子*/public final void makeDumpling() {// 擀面皮ganMianPi();// 包馅baoXian();// 水煮shuiZhu();// 出锅chuGuo();// 加基本调料jiaJiBenTiaoLiao();// 钩子hook();}/*** 擀面皮*/public void ganMianPi() {System.out.println("擀面皮");}/*** 包馅(抽象方法需要在子类中实现)*/public abstract void baoXian();/*** 水煮(抽象方法需要在子类中实现)*/public abstract void shuiZhu();/*** 出锅*/public void chuGuo() {System.out.println("出锅");}/*** 加基本调料*/public void jiaJiBenTiaoLiao() {System.out.println("加醋");}/*** 钩子(自定义扩展方法,默认实现为空)*/public void hook() {}}

韭菜馅饺子

/*** 韭菜馅饺子*/
public class LeekDumpling extends Dumpling{/*** 包馅*/@Overridepublic void baoXian() {System.out.println("包韭菜馅");}/*** 水煮*/@Overridepublic void shuiZhu() {System.out.println("水煮8分钟");}
}

猪肉馅饺子

/*** 猪肉馅饺子*/
public class PorkDumpling extends Dumpling{/*** 包馅*/@Overridepublic void baoXian() {System.out.println("包猪肉馅");}/*** 水煮*/@Overridepublic void shuiZhu() {System.out.println("水煮10分钟");}/*** 覆盖hook()方法,加其他调料*/@Overridepublic void hook() {System.out.println("加重辣");}
}

制作饺子

public class MakeDumpling {public static void main(String[] args) {// 制作韭菜馅饺子System.out.println("制作韭菜馅饺子");LeekDumpling leekDumpling = new LeekDumpling();leekDumpling.makeDumpling();System.out.println();// 制作猪肉馅饺子System.out.println("制作猪肉馅饺子");PorkDumpling porkDumpling = new PorkDumpling();porkDumpling.makeDumpling();}
}

输出结果

制作韭菜馅饺子
擀面皮
包韭菜馅
水煮8分钟
出锅
加醋制作猪肉馅饺子
擀面皮
包猪肉馅
水煮10分钟
出锅
加醋
加重辣

饺子的固定制作过程,擀面皮【ganMianPi()】,出锅【chuGuo()】, 加基本调料【jiaJiBenTiaoLiao()】每种饺子都是一样的,所以直接在父类中实现,实现了代码的复用。

包馅【baoXian()】,水煮【shuiZhu()】每种饺子都不一样,定义为抽象方法,具体的操作推迟到子类中实现。

钩子【hook()】方法比较有意思,在父类中默认实现为空,如果子类有什么特殊的操作,父类中没有定义的,那么子类就可以覆盖hook(),实现自己扩展的业务逻辑。

比如加辣椒,不是每个客人都喜欢吃辣的,那么需要加辣椒的顾客自己覆盖hook()方法,加上辣椒就行了,不需要加辣椒的顾客就不用重写hook()方法了。

总结

在模板模式经典的实现中,模板方法定义为 final,可以避免被子类重写。
需要子类重写的方法定义为 abstract,可以强迫子类去实现。
如果子类需要扩展,可以预留一个hook()的空实现方法,让需要的子类去重写。

该模式应用了好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你

换句话说就是:子类你别调用我们(父类),我们(父类)会调用你。

模板模式有两大作用:复用和扩展

复用指的是,所有的子类可以复用父类中提供的模板方法的代码。

扩展指的是,框架通过模板模式提供功能扩展点,也就是钩子hook(),让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。

代码链接
(欢迎关注公众号:编程我也会)

模板方法模式--我们一起下饺子相关推荐

  1. Windows环境下实现设计模式——模板方法模式(JAVA版)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现模板方法模式(设计模式). 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式 ...

  2. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之模板方法模式

    · 模板方法模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,有查看所有英雄功能,并且玩家在查看英雄时可以对英雄的排序做调整.具体而言,玩家可以按照默认排序.名称排序.熟练度排序.上架时间排序.荣耀 ...

  3. 设计模式之模板方法模式(Template Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 模板方法模式与策略模式的区别

    2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

  5. 从模板方法模式到JDBCTemplate

    将大象装进冰箱需要三步,那么老虎了?如何优雅的将大象装进冰箱? 把大象装进冰箱 Step 大象 老虎 ... First 打开冰箱门 打开冰箱门 打开冰箱门 Second 把大象放进去 把老虎放进去 ...

  6. 模板方法模式(Template Pattern)

    模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法的结构下,重新定义算法中的某些步骤. 这个模式是用来创建一个算法模板.模板就是一个方法.更具体地 ...

  7. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  8. 模板方法模式小记【原创】

    模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类中可以不改变的一个算法的结构即可重定义该算法的某些特定步骤. 首先来看下模板方法模式的结构图: AbstractCl ...

  9. 设计模式 — 行为型模式 — 模板方法模式

    目录 文章目录 目录 模板方法模式 应用场景 代码示例 模板方法模式 模板方法模式,定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容: 在模 ...

最新文章

  1. 如何修改系统时间显示格式
  2. 知识图谱前沿跟进,看这篇就够了,Philip S. Yu 团队发布权威综述,六大开放问题函待解决!...
  3. leetcode算法题--相交链表
  4. 手把手带你用数据库中间件Mycat+SpringBoot完成分库分表
  5. MQTT——QoS服务质量等级
  6. iOS中常见的内存问题
  7. 知乎超热门话题:为什么要考985?
  8. java 修改ini文件_Java读取和修改ini配置文件
  9. RTT时钟管理篇——阻塞延时和时基更新函数
  10. 存不存行李寄存平台_行李寄存柜和行李寄存平台的区别
  11. 精通JavaScript系列目录
  12. Spring Boot基础学习08 - Spring Boot整合Redis
  13. 空格符号复制html,cf空格符号复制(cf空格代码)
  14. java导出doc文档
  15. ARM处理器比较:A8/A9
  16. Java研发技术学习路线
  17. Excel中使用正则表达式的方法
  18. 悦诗风吟网络营销的目标_“悦诗风吟”品牌的促销策略研究
  19. 许家印马不停蹄 恒大造车提速
  20. html表单 access,【Access基础】OpenForm打开窗体方法详解

热门文章

  1. 计算机提高游戏运行速度的方法,怎么提高游戏运行速度
  2. vivox9怎么和计算机共享,vivo手机怎么和笔记本电脑共享文件和网络
  3. mysql 主从1146_mysql 主从复制1146错误处理办法
  4. OTN关联开销(电层开销)OTU开销ODU开销OPU开销
  5. canvas画圆又毛边
  6. 手机屏幕常见故障_触屏不灵敏、断触怎么回事?手机触摸屏的基本原理与常见问题排查方法介绍...
  7. python中小学生编程学习-推荐几个适合小白学习Python的免费网站
  8. 时间与运动-MATHLAB机器人学、机器视觉与控制
  9. PAT A1008 Elevator
  10. 利用python做出电视剧收视率排行榜