Java中的模板方法设计模式

模板方法模式是一种行为设计模式,它为算法提供了基础方法,称为模板方法,该方法将其某些步骤推迟到子类中,因此算法结构相同,但某些步骤可以由子类根据上下文重新定义。

模板是指预设格式,例如HTML模板,具有固定的预设格式。类似于模板方法模式,我们有一个称为模板方法的预设结构方法,该方法由步骤组成。此步骤可以是抽象方法,将由其子类实现。

简而言之,可以说,在模板方法模式中,存在定义步骤集的模板方法,并且可以将步骤的实现推迟到子类中。因此,模板方法定义了算法,但可以在子类中定义确切的步骤。

何时使用:

  • 当您具有算法的预设格式或步骤但步骤的实现可能会有所不同。
  • 如果要避免代码重复,请在基类中实现通用代码,并在子类中实现变体。

结构体:

因此,在上图中,您可以看到我们定义了三个步骤,即工序1,工序2和工序3的模板方法。其中操作1和工序2是抽象步骤,因此它们由ConcreteClass实现。我们在此处实现了工序3。在两种情况下,基类中的操作首先是所有人通用的,其次是该方法的默认实现。 UML图现在将更加清晰。

组件:

抽象类

  • 它定义了定义算法结构的模板方法。
  • 它还定义了抽象操作,这些抽象操作将由子类实现以定义算法步骤。

具体类

  • 它实现超类的抽象操作以执行算法的子类特定步骤,并且在不需要默认行为的情况下也覆盖操作

关于模板方法模式的要点:

  • 超级类中的模板方法遵循“ 好莱坞原则 ”:“ 不要给我们打电话,我们给您打电话 ”。 这是指这样的事实:不是从子类中的基类调用方法,而是在超类的模板方法中调用了子类的方法。
  • 超级类中的模板方法不应被覆盖,因此应使其最终化
  • 自定义钩子 :包含默认实现的方法可能会在其他类中被覆盖,这些方法称为钩子方法。 挂钩方法旨在被覆盖,而具体方法则不可。因此,在这种模式下,我们可以提供挂钩方法。问题是有时很难区分挂钩方法和具体方法。
  • 模板方法是代码重用的技术,因为有了它,您可以找出常见的行为并将特定的行为推迟到子类。

例:

让我们举个例子。当您必须从两个数据源(即CSV和数据库)中读取数据时,您必须处理该数据并以CSV文件的形式生成输出。这里涉及三个步骤。

  1. 从相应的数据源读取数据
  2. 处理数据
  3. 将输出写入CSV文件

Java代码:

下面的类包含名为“ parseDataAndGenerateOutput”的模板方法,该方法包括读取数据,处理数据以及写入csv文件的步骤。

1.DataParser.java

package org.arpit.javapostsforlearning;abstract public class DataParser {//Template method//This method defines a generic structure for parsing datapublic void parseDataAndGenerateOutput(){readData();processData();writeData();}//This methods will be implemented by its subclassabstract void readData();abstract void processData();//We have to write output in a CSV file so this step will be same for all subclassespublic void writeData(){System.out.println('Output generated,writing to CSV');}
}

在下面的课程中,该课程实施CSV特定步骤

2.CSVDataParser.java

package org.arpit.javapostsforlearning;public class CSVDataParser extends DataParser {void readData() {System.out.println('Reading data from csv file');}void processData() {System.out.println('Looping through loaded csv file');    }
}

在下面的课程中,数据库的特定步骤在该课程中实现

3.数据库DataParser.java

package org.arpit.javapostsforlearning;public class DatabaseDataParser extends DataParser {void readData() {System.out.println('Reading data from database');}void processData() {System.out.println('Looping through datasets');        }
}

4.TemplateMethodMain.java

package org.arpit.javapostsforlearning;public class TemplateMethodMain {/*** @author arpit mandliya*/public static void main(String[] args) {CSVDataParser csvDataParser=new CSVDataParser();csvDataParser.parseDataAndGenerateOutput();System.out.println('**********************');DatabaseDataParser databaseDataParser=new DatabaseDataParser();databaseDataParser.parseDataAndGenerateOutput();}}

输出:

Reading data from csv file
Looping through loaded csv file
Output generated,writing to CSV
**********************
Reading data from database
Looping through datasets
Output generated,writing to CSV

在Java API中使用:

  • java.io.InputStreamjava.io.OutputStreamjava.io.Readerjava.io.Writer所有非抽象方法。
  • java.util.AbstractListjava.util.AbstractSetjava.util.AbstractMap所有非抽象方法。
  • javax.servlet.http.HttpServlet ,默认情况下,所有doXXX()方法都会向响应发送HTTP 405“不允许使用方法”错误。 您可以随意实现任何一个或任何一个。

源代码: 下载

参考:来自我们的JCG合作伙伴 Arpit Mandliya的Java 模板方法设计模式, 适用于初学者博客的Java框架和设计模式 。

翻译自: https://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android adb源码分析(1)

ADB是Android debug bridge的缩写,它使用PC机可以通过USB或网络与android设备通讯。 adb的源码位于system/core/adb目录下,先来看下编译脚本Android.mk: [plain] view plaincopy# Copyright 2005 The Android Open Source Project # # Andr…

matlab二次二阶距,用Matlab改进一次二阶矩法程序.doc

用Matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法)题目:编制改进一次二阶矩法计算可靠指标的程序,并给出算例,要求提供源程序选取的算例为:zg(x,y)x*y-1140,其中x,y服从正态分布,μx38,Vx0.1,…

winform中的数据绑定

1. 简单的数据绑定 例1 using (SqlConnection conn new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ToString())) { SqlDataAdapter sda new SqlDataAdapter("Select * From T_Class Where F_TypeProduct order by F_RootID,F_Order…

jQuery数据表和Java集成

jQuery DataTables是一个开放源代码插件,用于在浏览器中创建表。 它具有许多功能,例如排序,服务器端处理, JQUERY UI主题滚动。 该插件的下载链接: http://www.datatables.net/download/ 在本演示中,我…

CSS 属性 - 伪类和伪元素的区别

伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。 :Pseudo-classes ::Pseudo-elements 但因为兼容性的问题&…

class-感知机Perception

1 感知机模型1.1 模型定义2 感知机学习策略2.1 数据的线性可分性2.2 学习策略3 学习算法3.1 算法原始形式3.2 收敛性3 学习算法的对偶形式1 感知机模型 感知机perceptron是二类分类问题的线性分类模型,输入为实例的特征向量,输出为实例的类别&#xff08…

图片资源 php,php URL图片资源传参生成对应尺寸图片

最近项目中需要上传大图,然后不同设备请求不同大小的图片,之前有用过一个通过URL参数来获取不同大小的图片的接口感觉设计方式请不错,于是就百度看看类似是如何实现的,找了几天找个两个功能类似的记录下。1、图片服务器 imagemagi…

Java中的方法调用有多昂贵

我们都去过那儿。 在查看设计不良的代码的同时,听听作者对人们永远不应该牺牲性能而不是设计的解释。 而且,您不能说服作者摆脱其500行方法,因为链接方法调用会破坏性能。 好吧,这可能在1996年左右是正确的。 但是自那时以来&…

UVa-116 Unidirectional TSP 单向旅行商

题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]a[i][j]max(d[i1][j1],d[i-1][j1]) 参考数字三角形,用逆推的方法,先确定最后一列d[i][n-1]a[i][n-1],再确定n-2列,此时d[i][n-2] a[i][n-2]min(d[i][n-1],d[i-1][n…

1.HTML

HTML简介 hyper text markup language 即超文本标记语言。 超文本: 就是指页面内可以包含图片、链接&#xff0c;甚至音乐、程序等非文字元素。 标准模板 <!DOCTYPE html> <html lang"en"><head> <meta charset"U…

error connection reset by peer 104

connection reset by peer的常见原因 1.服务器的并发连接数超过了其承载量&#xff0c;服务器会将其中一些连接关闭&#xff1b;2. errno 104错误表明你在对一个对端socket已经关闭的的连接调用write或send方法&#xff0c;在这种情况下&#xff0c;调用write或send方法后&…

php记住表单数据cookie,【PHP基础】cookies和session

1.Cookiescookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时&#xff0c;它同时会发送 cookie。通过 PHP&#xff0c;您能够创建并取回 cookie 的值。1.1、如何创建 cookie&#xff1f;setcookie() 函数用于设置 cookie。…

自己构建GlassFish 4.0快照

这篇文章是关于自己发布GlassFish 4.0快照的&#xff0c;其中包括一些黑客。 我找到了GlassFish FullBuild的官方说明&#xff0c;然后决定自己构建服务器。 有时&#xff0c;您可能不想等待团队升级GlassFish构建文件。 在本条目中&#xff0c;我将Artifactory称为私有Maven存…

【转】utf-8的中文是一个汉字占三个字节长度

因为看到百度里面这个人回答比较生动&#xff0c;印象比较深刻&#xff0c;所以转过来做个笔记 原文链接 https://zhidao.baidu.com/question/1047887004693001899.html 知乎也有更清晰解答 https://www.zhihu.com/question/23374078 1、美国人首先对其英文字符进行了编码&am…

matlab升压斩波仿真,升压斩波电路设计与仿真.doc

升压斩波电路设计与仿真1.序言近年来&#xff0c;不断进步的计算机技术为现代控制技术在实际生产、生活中提供了强有力的技术支持&#xff0c;新的材料和结构器件又促进了电力电子技术的飞速发展&#xff0c;且在各行业中得到广泛的应用。电力电子技术(Power Electronics Techn…

Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)...

浏览器及驱动下载 进行web UI 自动化时&#xff0c;需要安装浏览器驱动webdriver&#xff0c;Chrome浏览器需要安装chromedriver.exe 驱动&#xff0c;Firefox需安装 geckodriver.exe 驱动。 Chrome 下载&#xff1a; http://www.slimjet.com/chrome/google-chrome-old-version…

先进的ListenableFuture功能

上次我们熟悉了ListenableFuture 。 我答应介绍更高级的技术&#xff0c;即转换和链接。 让我们从简单的事情开始。 假设我们有从某些异步服务获得的ListenableFuture<String> 。 我们还有一个简单的方法&#xff1a; Document parse(String xml) {//...我们不需要Strin…

修改内表数据并输出结果

*定义结构ty_salesTYPES:BEGIN OF ty_sales, customerid(3) TYPE n, productid(3) TYPE n, orderid(3) TYPE n, customername(10) TYPE c, amount TYPE i, END OF ty_sales.*定义内表和工作区DATA: it_sales TYPE STANDARD TABLE OF ty_sales WITH KEY customerid …

关于css透明度的问题

先看background和background-color background:可以设置背景颜色&#xff0c;背景图片&#xff0c;还有定位。默认background:no-repeat; background-color:只可以设置背景颜色。默认background:repeat; 设置透明度的方式有两种&#xff1a; 第一种&#xff1a; opacity:0.…

java多字段排序,java8 stream多字段排序的实现

很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理使用java8新特性,下面先来点基础的List list; 代表某集合//返回 对象集合以类属性一升序排序list.stream().sorted(Comparator.comparing(类::属性一));//返回 对象集合以类属性一降序排序 注…