子模板继承父模板示例_模板设计模式示例

子模板继承父模板示例

本文是我们名为“ 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的钩子。 默认情况下,启用日志记录的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/336941.shtml

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

相关文章

10个超赞的C语言开源项目!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删今天分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!目录:1. Webbench2. Tinyhttpd3. cJSON4. C…

jboss eap 7_使用JBoss EAP 7的HTTP / 2

jboss eap 7就在几天前,新的JBoss EAP 7 ALPHA版本已经发布。 而且我已经写过博客,介绍如何开始使用它 。 一个非常有趣的部分是HTTP / 2支持,它已作为技术预览添加。 它由新的Web服务器Untertow提供。 HTTP / 2通过压缩头并在同一TCP连接上多…

Modern C++ 最核心的变化是什么?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删个人觉得最核心的变化是右值引用的引入,右值引用是 C 走向现代化的最重要一步。建议每一位 C 开发者都应该深入去了解并充分使用它。…

设计模式示例_命令设计模式示例

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

第一个C语言编译器是怎样编写的

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗&#xff1…

备忘录模式 命令模式_备忘录设计模式示例

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

还在分析我写的 bug 啊,我都是随便写的!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删还在分析我写的 bug 啊,我都是随便写的!客户就是可以为所欲为,怎么地!下面教大家如何对付产品经理…

mysql如何让表建立连接吗_MySQL 表与表之间建立关系

引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次;今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时…

访客模式 无痕模式 区别_访客设计模式示例

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

项目经理升职了是啥_什么是升职率?

项目经理升职了是啥我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能会并且将导致晋升人员不再符合工作资格的情况。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将…

mysql事件定时_MySQL事件(定时任务)

whats the MySQL 事件MySQL5.1 版本开始引进 event 概念,MySQL 中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似 Linux 中的 crontab,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点…

lucene简介_Lucene简介

lucene简介本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中&…

jsp mysql 插入数据_jsp连接MySQL实现插入insert操作功能示例

下午终于实现了jsp连接MySQL执行插入操作的功能。在index.jsp页面输入数据,提交到mysql——insert.jsp页面进行插入数据库的操作。index.jsp页面代码如下:request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8&…

swagger生成示例_生成器设计模式示例

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

设计模式适配器模式_适配器设计模式示例

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

mysql mgr bug_Mysql MGR架构误操作引发的问题处理

【背景介绍】故障方描述:一次用户刷权限的时候不小心把数据库用户表记录删掉了,执行之后发现不对后重建用户,杀掉进程后重新MGR启动报错。【报错信息】2018-06-13T12:47:41.405593Z 32 [Note] Plugin group_replication reported: Group comm…

css外墙法_外墙设计模式示例

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

设计模式示例_桥梁设计模式示例

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

数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池

在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线…

设计模式示例_状态设计模式示例

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