模板设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是模板设计模式 3.实施模板设计模式 4.在模板内部引入一个挂钩 5.何时使用模板设计模式 6. JDK中的模板模式 7.下载源代码

1.简介

模板设计模式是一种行为模式,顾名思义,它提供了供用户使用的模板或算法结构。 用户无需改变算法的结构即可提供自己的实现。

在问题的帮助下更容易理解这种模式。 我们将在本节中了解场景,并在下一节中使用Template模式实施解决方案。

您是否曾经使用Java应用程序连接到关系数据库? 让我们回想一下连接数据并将数据插入数据库所需的一些重要步骤。 首先,根据要连接的数据库,需要一个驱动程序。 然后,我们将一些凭据传递给数据库,然后,准备一条语句,将数据设置到insert语句中,然后使用insert命令将其插入。 稍后,我们关闭所有连接,并有选择地销毁所有连接对象。

无论任何供应商的关系数据库,您都需要编写所有这些步骤。 考虑一个问题,您需要将一些数据插入不同的数据库。 您需要从CSV文件中获取一些数据,然后将其插入MySQL数据库中。 一些数据来自文本文件,应将其插入Oracle数据库中。 唯一的区别是驱动程序和数据,其余步骤应该相同,因为JDBC提供了一组通用的接口来与任何供应商的特定关系数据库进行通信。

我们可以创建一个模板,该模板将为客户端执行一些步骤,并留下一些步骤让客户端以自己的特定方式实现它们。 (可选)客户端可以覆盖某些已定义步骤的默认行为。

现在,在实现代码之前,让我们进一步了解模板设计模式。

2.什么是模板设计模式

模板模式定义了操作中算法的框架,将某些步骤推迟到子类。 模板方法允许子类在不更改算法结构的情况下重新定义算法的某些步骤。

模板方法模式可以在存在算法的情况下使用,其中某些步骤可以以多种不同方式实现。 在这种情况下,模板方法模式建议将算法的大纲保留在一个类(称为模板类)内的称为模板方法的单独方法中,而忽略变体部分的具体实现(步骤该算法可以针对此类的不同子类以多种不同方式实现)。

Template类不一定必须将实现全部留给子类。 而是,作为提供算法概述的一部分,Template类还可以提供一定数量的实现,这些实现可以视为在不同实现之间是不变的。 如果合适,它甚至可以为变体部件提供默认实现。 在不同的子类中将仅实现特定的细节。 这种实现方式消除了对重复代码的需求,这意味着要编写的代码量最少。

图1-类图

图1

抽象类

  • 定义具体的子类定义的抽象基本操作,以实现算法的步骤。
  • 实现定义算法框架的模板方法。 模板方法调用原始操作以及在AbstractClass定义的操作或其他对象的操作。
    ConcreteClass
  • 实现原始操作进行。

3.实施模板设计模式

在下面,我们可以看到连接模板类,该类用于为客户端提供一个用于连接各种数据库并与之通信的模板。

package com.javacodegeeks.patterns.templatepattern;public abstract class ConnectionTemplate {public final void run() {setDBDriver();setCredentials();connect();prepareStatement();setData();insert();close();destroy();}public abstract void setDBDriver();public abstract void setCredentials();public void connect() {System.out.println("Setting connection...");}public void prepareStatement() {System.out.println("Preparing insert statement...");}public abstract void setData();public void insert() {System.out.println("Inserting data...");}public void close() {System.out.println("Closing connections...");}public void destroy() {System.out.println("Destroying connection objects...");}
}

抽象类提供了连接,通信以及稍后关闭连接的步骤。 必须完成所有这些步骤才能完成工作。 该类为某些常见步骤提供了默认实现,并将特定步骤保留为抽象,从而迫使客户端为其提供实现。

用户应该实现setDBDriver方法以提供特定于数据库的驱动程序。 对于不同的数据库,凭据可能不同; 因此, setCredentials也保留为抽象状态,以使用户可以实现它。

同样,使用JDBC API连接到数据库并准备语句是很常见的。 但是,数据将是特定的,因此用户将提供它,而其他步骤(如运行插入语句,关闭连接和销毁对象)则与任何数据库相似,因此它们的实现在模板内保持通用。

上一类的关键方法是run方法。 run方法用于按顺序运行这些步骤。 该方法被设置为最终方法,因为这些步骤应保持安全,并且任何用户都不得更改。

下面的两个类扩展了模板类,并为某些方法提供了特定的实现。

package com.javacodegeeks.patterns.templatepattern;public class MySqLCSVCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting MySQL DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for MySQL DB...");}@Overridepublic void setData() {System.out.println("Setting up data from csv file....");}
}

上面的类用于连接到MySQL数据库,并通过读取CSV文件提供数据。

package com.javacodegeeks.patterns.templatepattern;public class OracleTxtCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting Oracle DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for Oracle DB...");}@Overridepublic void setData() {System.out.println("Setting up data from txt file....");}
}

上面的类用于连接到Oracle数据库,并通过读取文本文件来提供数据。

现在,让我们测试代码。

package com.javacodegeeks.patterns.templatepattern;public class TestTemplatePattern {public static void main(String[] args) {System.out.println("For MYSQL....");ConnectionTemplate template = new MySqLCSVCon();template.run();System.out.println("For Oracle...");template = new OracleTxtCon();template.run();}
}

上面的代码将导致以下输出:

For MYSQL....
Setting MySQL DB drivers...
Setting credentials for MySQL DB...
Setting connection...
Preparing insert statement...
Setting up data from csv file....
Inserting data...
Closing connections...
Destroying connection objects... For Oracle...
Setting Oracle DB drivers...
Setting credentials for Oracle DB...
Setting connection...
Preparing insert statement...
Setting up data from txt file....
Inserting data...
Closing connections...
Destroying connection objects...

上面的输出清楚地显示了模板模式如何使用类似的方式与不同的数据库连接和通信。 该模式将通用代码保留在一个类下,并提高了代码的可重用性。 它为用户设置了一个框架并对其进行控制,并允许用户扩展模板,以便为某些步骤提供特定的实现。

现在,如果我们通过添加日志记录机制来增强上述示例。 但是代码的某些用户不想添加此功能,要实现此功能,我们可以使用钩子。 挂钩是模板类内部具有默认行为的简单方法; 此行为可用于更改一些可选步骤。 用户应实现此方法,该方法可以挂接到模板类内部以更改算法的可选步骤。

4.在模板内部引入一个挂钩

让我们用钩子增强上面的示例。

package com.javacodegeeks.patterns.templatepattern;import java.util.Date;public abstract class ConnectionTemplate {private boolean isLoggingEnable = true;public ConnectionTemplate() {isLoggingEnable = disableLogging();}public final void run() {setDBDriver();logging("Drivers set [" + new Date() + "]");setCredentials();logging("Credentails set [" + new Date() + "]");connect();logging("Conencted");prepareStatement();logging("Statement prepared [" + new Date() + "]");setData();logging("Data set [" + new Date() + "]");insert();logging("Inserted [" + new Date() + "]");close();logging("Conenctions closed [" + new Date() + "]");destroy();logging("Object destoryed [" + new Date() + "]");}public abstract void setDBDriver();public abstract void setCredentials();public void connect() {System.out.println("Setting connection...");}public void prepareStatement() {System.out.println("Preparing insert statement...");}public abstract void setData();public void insert() {System.out.println("Inserting data...");}public void close() {System.out.println("Closing connections...");}public void destroy() {System.out.println("Destroying connection objects...");}public boolean disableLogging() {return true;}private void logging(String msg) {if (isLoggingEnable) {System.out.println("Logging....: " + msg);}}
}

我们在上述模板类中引入了两个新方法。 disableLogging是一个返回boolean的钩子。 默认情况下,启用日志记录的布尔值isLoggingEnable为true。 如果应该为他的代码禁用日志记录,则用户可以覆盖此方法。 另一种是用于记录消息的私有方法。

下面的类实现了hook方法并返回false,从而关闭了此特定工作的日志记录机制。

package com.javacodegeeks.patterns.templatepattern;public class MySqLCSVCon extends ConnectionTemplate {@Overridepublic void setDBDriver() {System.out.println("Setting MySQL DB drivers...");}@Overridepublic void setCredentials() {System.out.println("Setting credentials for MySQL DB...");}@Overridepublic void setData() {System.out.println("Setting up data from csv file....");}@Overridepublic boolean disableLogging() {return false;}
}

让我们测试一下这段代码。

package com.javacodegeeks.patterns.templatepattern;public class TestTemplatePattern {public static void main(String[] args) {System.out.println("For MYSQL....");ConnectionTemplate template = new MySqLCSVCon();template.run();System.out.println("For Oracle...");template = new OracleTxtCon();template.run();}
}

上面的类将导致以下输出:

For MYSQL....
Setting MySQL DB drivers...
Setting credentials for MySQL DB...
Setting connection...
Preparing insert statement...
Setting up data from csv file....
Inserting data...
Closing connections...
Destroying connection objects... For Oracle...
Setting Oracle DB drivers...
Logging....: Drivers set [Sat Nov 08 23:53:47 IST 2014]
Setting credentials for Oracle DB...
Logging....: Credentails set [Sat Nov 08 23:53:47 IST 2014]
Setting connection...
Logging....: Conencted
Preparing insert statement...
Logging....: Statement prepared [Sat Nov 08 23:53:47 IST 2014]
Setting up data from txt file....
Logging....: Data set [Sat Nov 08 23:53:47 IST 2014]
Inserting data...
Logging....: Inserted [Sat Nov 08 23:53:47 IST 2014]
Closing connections...
Logging....: Conenctions closed [Sat Nov 08 23:53:47 IST 2014]
Destroying connection objects...
Logging....: Object destoryed [Sat Nov 08 23:53:47 IST 2014]

您可以在输出中清楚地看到,对于MySQL实现,日志记录已关闭,而对于Oracle实现,日志记录已关闭。

5.何时使用模板设计模式

在以下情况下应使用模板方法模式:

  • 一次实现算法的不变部分,然后将其留给子类来实现可以变化的行为。
  • 子类之间的共同行为应分解并集中在一个共同类中,以避免代码重复。 您首先要确定现有代码中的差异,然后将差异分为新的操作。 最后,将不同的代码替换为调用这些新操作之一的模板方法。
  • 控制子类扩展。 您可以定义一个模板方法,该方法在特定点调用“挂钩”操作(请参阅结果),从而仅允许在这些点进行扩展。

6. JDK中的模板模式

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()

7.下载源代码

这是有关模板设计模式的课程。 您可以在此处下载源代码: TemplatePattern-Project

翻译自: https://www.javacodegeeks.com/2015/09/template-design-pattern.html

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

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

相关文章

账号被暂时禁用使用VScode不能上传代码的解决办法

最近项目在开发的过程中突然不能提交代码,然后使用git账号登录gitee,发现账号账号不能登录了,不知道什么原因导致的禁用,这个账号sunjiaoshou01是被行方同步数据导致的禁用,一问管理员就说是可能一个月没登录会自动封禁…

地图库地之图地图窝_「方舆」秦朝地图及行政区划

秦朝是中国历史上一个极为重要的朝代,由战国时期的秦国发展起来的统一大国,它结束了自春秋起五百年来分裂割据的局面,成为中国历史上第一个大一统的中央集权制国家。秦朝统一六国时,国土面积为214万平方公里,后北收河套…

智能柜台C端代码规范

语法上建议:一、建议尽量使用””代替””上述比较好上述HX0188是一个字符串,用!替代比较好二、引用的组件/插件在当前vue文件内并未使用例:chk_bcip\src\business\common\views\ common-auditwait.vueDevice._$和Utils.AppUtils 都未使用&am…

华为云电脑和马云无影比_阿里云打造未来电脑无影,却因为5G限制,很难达到普及...

在9月17日,在2020阿里巴巴云栖大会上,阿里云发布了第一台云电脑"无影",极致的简约,一张卡片大小的机器就等于一台电脑了。看到这款电脑的宣传片,真的是极致的未来感,随随便便一块小透明玻璃就是电…

SQL SERVER 2016研究三

2016 SQL SEVER 全程加密程式 column encryption settingEnabled; 重点:需要使用.Net Framework 4.6 新建一个程式如下: 1、创建链接数据库,必选栏位,影响加密。 2、或者在web.config文件数据链接字符串增加如下语句: …

小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!

大家好,我是汽修小诺,喜欢有关汽车知识的小伙伴请关注我哦,感谢大家!现在有车的朋友越来越多,开车途中难免会遇到汽车故障显示灯亮,从而不知道什么原因,有的朋友不敢开,等修理厂来检…

策略设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

vscode修改json.maxItemsComputed配置解决提示

由于要测试明细查询打印业务,分页每页显示30行,要打印30页以上的数据,在打印的过程中会出现分页的问题,这里使用仿真工具测试,需要修改mock数据,造数据,超过5000行就有提示了,需要扩…

【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)

面试过不少前端从业者,简历写的平平淡淡,别人会的技能他也都会,看起来什么都掌握一些;有些会请过来当面聊一下,有些就直接拒绝了(如果是公司内要求独立完成项目的岗位,简历里放很多学习时候的DE…

观察者设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

震惊!2021年数十个技术领域图谱曝光,包含Golang、区块链、人工智能、架构师等领域学习路线

前言:不知道你是否和我一样,刚开始学习某个技术领域的时候缺乏坚持的动力,没有一个清晰的学习路线,学习的过程中没有人指导,遇到问题没人一起解答,想深入学习某个领域而又无从下手,不知道该从何处学起?这不,你想要的技术图谱来啦。有了这款武功秘籍,不光能开阔视野,…

70多套java必练项目,适合小白上手!

导读:这些项目不管是找工作练手,还是公司使用当作模板进一步改进,亦或者是当作毕业设计,都很有借鉴意义! 编译器建议使用:IDEA,Myeclipse,eclipse,HB-X等都可以。 数据库建议使用,mysql,oracle,…

mysql mycat 路由规则_Mycat分库路由规则

Mycat分库路由规则发布时间:2020-06-15 16:54:10来源:51CTO阅读:11651作者:lzf05303774一、Mycat分库路由分为连续路由和离散路由。1、连续路由:(1)、常用的路由方式:auto-sharding-long、sharding-by-date…

孙叫兽CSDN社区云----WebIT已创建,欢迎大家前端全栈小伙伴踊跃加入

目录 社区云是什么? 创建CSDN社区云WebIT的目的 推荐分享的技术点(如下图所示) 社区成员权益 版主权益 管理员权益 WebIT社区云积分规则 WebIT优质版主及管理员可以申请直播分享前端技术 WebIT社区云将为社区运营者提供: …

迭代器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

uibinder表单提交_使用UIBinder的GWT自定义按钮

uibinder表单提交这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandl…

python用import xlwt出现红字_如何用python处理excel

最近看到有很多的python课程是教人怎么用python处理excel,我看了一下价格收费还贼高...这么初级毫无水平的操作我的粉丝们就不要花钱去报课程了..我免费教你们怎么做.首先我们先要安装两个模块,一个叫做xlrd,一个是xlwt.安装如下:打开cmd输入pip install xlrd等待安装成功,成功…

什么是升职率?

我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能并且将导致晋升人员不再符合该职位的条件。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将探讨提升率的概念&…

mysql自增id用完了_MySQL表自增id用完了该怎么办?

我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的,但是在计算机里&…

jmeter插件监控cpu小节点

JMeter使用plugins插件进行服务器性能监控 性能测试时,我们的关注点有两部分 1 服务本身:并发响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMeter的plugins插件可以实现对"二"的监控,具体操作步骤如下(…