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,一经查实,立即删除!

相关文章

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…

Java中的方法调用有多昂贵

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

1.HTML

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

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

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

C#调用Power Shell 管理Office365 执行脚本时遇到的问题

Power Shell管理Office参考http://www.mamicode.com/info-detail-494553.html C#调用Power Shell 参考 https://www.cnblogs.com/chenkai/archive/2010/11/09/1872471.html string pwd "**********";string userName "**********";StringBuilder ss new…

javaweb(三十七)——获得MySQL数据库自动生成的主键

测试脚本如下&#xff1a; 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码&#xff1a; 1 package me.gacl.demo;2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; …

基于Matlab的模拟通信实验平台设计,【通信原理仿真实验】通信原理虚拟实验仿真平台的设计和实现_玛雅作文网...

作文「通信原理虚拟实验仿真平台的设计和实现」共有 4564 个字&#xff0c;其中有 2704 个汉字&#xff0c;1316 个英文&#xff0c;162 个数字&#xff0c;382 个标点符号。作者佚名&#xff0c;请您欣赏。玛雅作文网荟萃众多优秀学生作文&#xff0c;如果想要浏览更多相关作文…

2018/3/1 省选模拟考试 50分

T1 30分模拟暴力&#xff0c;40分树的直径。拿了0分。&#xff08;空间开小了爆了&#xff0c;因为缩点之后是又建了一次图&#xff0c;两个边的编号tot没分开&#xff0c;mdzz&#xff09; 只写了后40分&#xff0c;而这40分中有20分不需要边双连通分量。写了一个类似于强连通…

骆驼和春天的Drools决策表

正如我在之前的文章中所展示的那样&#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是&#xff0c;对于非技术人员而言&#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么可以提供一种轻松的方式来创建业务规则的方法-在电子表格中创建决策表&…

酷炫,用Html5/CSS实现文字阴影

前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现。她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过于局限化,好了,闲话也不多说,咱们就先来看看这个文本阴影. 一.文字阴影text-shadow 文…

从xtrabackup备份恢复单表【转】

目前对MySQL比较流行的备份方式有两种&#xff0c;一种上是使用自带的mysqldump&#xff0c;另一种是xtrabackup&#xff0c;对于数据时大的环境&#xff0c;普遍使用了xtrabackupbinlog进行全量或者增量备份&#xff0c;那么如何快速的从xtrabackup备份中恢复单张表呢&#xf…

CSS中的overflow属性

overflow属性 如果元素中的内容超出了给定的宽度和高度属性&#xff0c;overflow 属性可以确定是否显示滚动条&#xff0c;是否隐藏溢出部分等行为&#xff0c;规定当内容溢出元素框时发生的事情。 可能的值有&#xff1a; visible&#xff1a;默认值。内容不会被修剪&#xff…

【知识梳理1】Android触摸事件机制

前言 随着科学技术的发展&#xff0c;智能手机早已成为我们当代人身边不可缺少的“伙伴”之中的一个&#xff0c;堪比对象女友。每天我们对着手机反复的做着点击、滑动操作&#xff0c;而手机则随着我们的操作给我们展示她的精彩。… 废话到此结束。 看到这里&#xff0c;即使…

自己做的一个登录页面,纯代码!

先上效果图吧. 本人菜鸟入门, 请勿喷. 首先样式: 1 1 body{2 2 margin: 0;3 3 padding: 0;4 4 width: 100%;5 5 height: 100%;6 6 }7 7 8 8 .headers{9 9 width: 100%;10 10 height: 100px;11 11 }12 12 .siv-ng{13 13 width:…

ASP.NET调用cmd命令提示符拒绝访问解决方案

using System.Diagnostics; public class CmdHelper{private static string CmdPath "C:\Windows\System32\cmd.exe";/// <summary>/// 执行cmd命令/// 多命令请使用批处理命令连接符&#xff1a;/// <![CDATA[/// &:同时执行两个命令/// |:将上一个命…

Some reading, some thinking.

update&#xff1a;感谢助教0 0又学会一招&#xff0c;play 了一下CSS Part 1 Reading AuthorArticleNoteMadcola《两年波折路&#xff08;考研、工作、考研&#xff09;》"吾志所向&#xff0c;一往无前&#xff1b;愈挫愈奋&#xff0c;再接再励。"辜新星《时刻调…

CSS选择器:伪类(图文详解)

本文最初发表于博客园&#xff0c;并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我&#xff0c;一起入门和进阶前端。 以下是正文。 伪类&#xff08;伪类选择器&#xff09; 伪类&#xff1a;同一个标签&#xff0c;根据其不同的种状态&#xff0c;有不同的样式。…