当前位置: 首页 > news >正文

java模板方法模式_设计模式之模板方法模式(java代码实现)

模板方法模式也是也是比较容易理解的,就比如说做饭,同样的步骤不同的人做味道是不一样的。或者是造汽车,同样的步骤,造车厂商不一样,造出来的汽车质量不同。这就是模板方法模式。这篇文章将通过案例详细的讲解一下模板方法模式。

1、概念

它定义一个操作中的算法的框架,而将一些步骤延迟到了子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。

2、例子

我们拿做饭的例子来说明。比如就做个西红柿鸡蛋吧。我们可以简单地定义一下步骤:

第一步:放油

第二步:放西红柿

第三步:放鸡蛋

当然真正做起来可能要比这复杂的多,就不必纠结于此了。上面我们提到过,同样的步骤其实不同的人做出来的饭是不一样的。我们就拿自己和五星级大厨来比较吧。人总是要有点自信心,虽然会被打脸。

不过在代码实现之前,我们可以先看一下模板方法模式的类图:

9b0223ac3d959eb5f5e043f857368935.png

我们就拿自己和大厨比较,我们可以看到在这里其实有两个角色:

(1)模板方法:他定义了一系列方法,提供了一个骨架。

(2)具体类:实现上面模板方法类提供的骨架。不同的具体类实现这个模板方法的骨架方式是不一样的。

下面代码实现一下。

3、代码实现

第一步:定义模板方法类(cook的骨架)

fae7f2a9bc2b904c28019e45d88678f0.png

第二步:定义具体类(我和大厨)

首先是我做饭

3f0587f9234fce3e71bf70a5bf305348.png

然后是大厨做饭

31b513b08201f1bdd370dc1e7ac2d55f.png

第三步:模拟炒菜的过程

5a1105a9703eceb90ce743b0f6cb7bcd.png

看结果我们就能知道,炒西红柿鸡蛋的过程是一样的,但是实现起来却不一样,就像买衣服,模特身上穿起来很好看,但是自己买的时候穿起来那真是惨不忍睹,这就是模板方法模式,我们对其进行一个总结。

4、优缺点

先说一下他的优点吧:

(1)把不可改变的封装起来,把能够改变的扩展开来

(2)他把很多类的共同操作给封装了起来,利于维护

(3)其实我们发现,我们在定义行为时候都是由父类去定义,然后子类去实现即可。

再聊一下他的缺点:

缺点很简单,我们发现虽然我们把一些类的共同操作封装了起来,但是当这些类比较多时,效果就不好了,因为有一个拓展子类都需要继承它,子类多了就不好了。

5、钩子函数

钩子就是给子类一个授权,让子类来决定模板方法的逻辑执行。就比如在炒西红柿鸡蛋的时候,由子类去决定是否要加调料。我们去实现一下:

第一步:定义模板类:

87885f2e0309775937c7c83cbab7a5be.png

第二步:定义具体类

首先是自己:

00f994d58393d90f9e7e3775a31404bf.png

然后是大厨

cbf41c59ebba6ac3a61643f2c1f5745a.png

第三步:测试一下:

1b95fadb0abcfb163c17d50a265e78e3.png

钩子函数就是这样使用的。子类就可以设置其逻辑是否执行。自己动手写一遍是理解最好的方式。

相关文章:

  • java package name_Java Package getName()用法及代码示例
  • java pojo 转 map_如何将POJO对象转换成MAP
  • io流 java代码_java IO流 对文件操作的代码集合
  • java中重写的作用_Java中的重写
  • java def_java 8 default关键字
  • java url xml_从Java中的URL读取XML字符串
  • java 8 关键字_JAVA 8 '::' 关键字
  • java类中静态块_java – 为什么.class不调用类中的静态块?
  • java referrer_JavaScript中document.referrer的用法详解
  • java代码压缩文件_使用Java代码压缩文件或文件夹
  • 石子合并 动态规划 java_动态规划:圆形石子合并问题
  • java修饰方法_Java 修饰符
  • arduino timer频率_Arduino利用TimerOne库产生固定频率和占空比的方波
  • flask数据库mysql增删查改_flask_sqlalchemy简单增删查改操作
  • java基础语法的意义_关于java基础语法的学习笔记
  • 深入了解以太坊
  • 【翻译】babel对TC39装饰器草案的实现
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • css属性的继承、初识值、计算值、当前值、应用值
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • java正则表式的使用
  • Linux后台研发超实用命令总结
  • linux学习笔记
  • MySQL-事务管理(基础)
  • Mysql优化
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端自动化解决方案
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 为什么要用IPython/Jupyter?
  • 详解移动APP与web APP的区别
  • 因为阿里,他们成了“杭漂”
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • (function(){})()的分步解析
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (五)c52学习之旅-静态数码管
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net 7 上传文件踩坑
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Remoting学习笔记(三)信道
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net实现客户区延伸至至非客户区
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • [ C++ ] STL_list 使用及其模拟实现
  • [20171102]视图v$session中process字段含义
  • [20171113]修改表结构删除列相关问题4.txt
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ2208][Jsoi2010]连通数
  • [CERC2017]Cumulative Code
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [codevs 1296] 营业额统计
  • [HackMyVM]靶场 VivifyTech