java 模板方法设计模式_Java中的模板方法设计模式

java 模板方法设计模式

模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类。 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的。

让我们通过一个例子来理解这种模式,假设我们想提供一种建造房屋的算法。 建造房屋需要执行的步骤是-建造地基,建造Struts,建造墙壁和窗户。 重要的一点是,我们无法更改执行顺序,因为我们无法在构建基础之前构建窗口。 因此,在这种情况下,我们可以创建一个模板方法,该方法将使用不同的方法来建造房屋。

现在,建造房屋的基础对于所有类型的房屋都是相同的,无论是木制房屋还是玻璃房屋。 因此,我们可以为此提供基本的实现,如果子类要重写此方法,则它们可以但对于大多数类型的房屋来说通常是通用的。

为了确保子类不会覆盖template方法,我们应该将其定型。

模板方法抽象类

由于我们希望某些方法可以由子类实现,因此我们必须将基类设置为抽象类 。

HouseTemplate.java

package com.journaldev.design.template;public abstract class HouseTemplate {//template method, final so subclasses can't overridepublic final void buildHouse(){buildFoundation();buildPillars();buildWalls();buildWindows();System.out.println("House is built.");}//default implementationprivate void buildWindows() {System.out.println("Building Glass Windows");}//methods to be implemented by subclassespublic abstract void buildWalls();public abstract void buildPillars();private void buildFoundation() {System.out.println("Building foundation with cement,iron rods and sand");}
}

buildHouse()是模板方法,它定义执行多个步骤的执行顺序。

模板方法具体类

我们可以有不同类型的房屋,例如木制房屋和玻璃房屋。

WoodenHouse.java

package com.journaldev.design.template;public class WoodenHouse extends HouseTemplate {@Overridepublic void buildWalls() {System.out.println("Building Wooden Walls");}@Overridepublic void buildPillars() {System.out.println("Building Pillars with Wood coating");}}

我们也可以覆盖其他方法,但是为了简单起见,我没有这样做。

GlassHouse.java

package com.journaldev.design.template;public class GlassHouse extends HouseTemplate {@Overridepublic void buildWalls() {System.out.println("Building Glass Walls");}@Overridepublic void buildPillars() {System.out.println("Building Pillars with glass coating");}}

模板方法模式客户端

让我们用一个测试程序来测试我们的模板方法模式示例。

HousingClient.java

package com.journaldev.design.template;public class HousingClient {public static void main(String[] args) {HouseTemplate houseType = new WoodenHouse();//using template methodhouseType.buildHouse();System.out.println("************");houseType = new GlassHouse();houseType.buildHouse();}}

请注意,客户端正在调用基类的模板方法,并且根据不同步骤的实现,它正在使用基类中的某些方法和子类中的某些方法。

上面程序的输出是:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

模板方法类图

模板方法模式

JDK中的模板方法模式

  • java.io.InputStream,java.io.OutputStream,java.io.Reader和java.io.Writer的所有非抽象方法。
  • java.util.AbstractList,java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法。

重要事项

  • 模板方法应包含固定顺序的某些步骤,对于某些方法,实现因基类而异。 模板方法应该是最终的。
  • 在大多数情况下,子类从超类调用方法,但是在模板模式中,超类模板方法从子类调用方法,这就是好莱坞原则 -“不要叫我们,我们会叫你”。
  • 具有默认实现的基类中的方法称为Hooks ,它们打算被子类覆盖,如果您希望某些方法不被覆盖,则可以将它们定型,例如,在我们的例子中,可以使buildFoundation() final方法,因为如果我们不希望子类覆盖它。

以上就是Java中模板方法模式实现的全部,希望您喜欢它。

参考:来自Java的JCG合作伙伴 Pankaj Kumar的Java模板方法设计模式,位于Developer Recipes博客上。

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

java 模板方法设计模式

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

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

相关文章

FPGA(2)--例化语句--1位全加器

文章目录一、实验目的二、实验内容三、实验设计四、实验结果及仿真一、实验目的 熟悉元件封装方法,掌握层次化电路设计方法;掌握VHDL例化语句的设计方法。 二、实验内容 1.用VHDL语言设计1位全加器,其中仅就半加器实体进行例化声明及端口映…

对mysql的总结与反思_一次DB故障引起的反思和MySQL Operator选型

前言在一次数据库故障后,我们发现业务库会根据业务的等级会划分多个 MySQL 实例,许多业务库会同时属于一个 MySQL 实例,当一个库引发问题后整个实例的状态是不可控的。从而导致这个实例上的所有业务不稳定甚至造成中断。故障反思微服务架构微…

android 三星 拍照,安卓里面拍照最好的三个品牌,OPPO华为三星怎么选

原标题:安卓里面拍照最好的三个品牌,OPPO华为三星怎么选几乎每一个节日都能被国内的商家抓住并且成功的策划为一次次的「购物节」,双十一、双十二等无一例外,3月7日这个从中国高校里衍生出来的「女生」节如今也成为了「女神节」。…

FPGA(3)--VHDL及原理图--4位全加器

文章目录一、实验目的二、实验内容三、实验设计五、实验思考与总结一、实验目的 掌握例化语句的使用方法,掌握使用程序文本和原理图结合方法设计电路,掌握利用包含算术操作符的重载函数的使用。 二、实验内容 首先用VHDL语言设计1位全加器&#xff0c…

Vertx编程风格:您的反应式Web Companion REST API解释了

Vertx提供了许多在轻量级环境中进行编程的选项,例如node.js。 但是,对于新用户来说,选择采用哪种方法来创建REST API几乎不会造成混淆。 在vertx中编程时可以采用不同的模型。 下面通过易于理解的图表对其进行说明。 PS – vertx编程的核心…

过去式加ed的发音_小学英语动词过去式归类总结

小学英语动词过去式归类总结  一、动词过去式的规则变化 1. 一般情况下,动词词尾加-ed 如:work ---worked, play---played, want----wanted, act----acted 2. 以不发音的 -e 结尾动词,动词词尾加 -d 把动词原形最后的e去掉&#xff0…

FPGA(4)--VHDL--4位D触发器

一、实验目的 掌握利用VHDL语言,进行基本时序元件的设计。 二、实验内容 利用VHDL语言设计含异步复位(RST)及使能端(EN)的4位D触发器,其中输入D及输出Q均为4位(STD_LOGIC_VECTOR)…

鸿蒙10 5G手机,继鸿蒙后麒麟V10问世 5G时代国产操作系统将起飞

(记者 陈洲)从工信部获悉,中国电子近日在广州发布了银河麒麟操作系统 V10。该系统打通了手机、平板、PC 等多个终端,可谓为5G时代量身定做。其独创的 kydroid 技术,可将安卓应用无缝迁移到国产平台上。银河麒麟V10是继华为鸿蒙OS后&#xff0…

模糊查询关键字不区分大小写_SQL简单查询

SQL书写规则:1)以英文分号结尾(;) eg. select 姓名,性别 from student;2)不区分关键字的大小写。就像Excel里面sum可以大写可以小写。同理,SQL中select不区分大小写。3)列名不能加单引号,列名中间不能有空格。4)所有符号都要是英文…

FPGA(5)--VHDL--10十进制计数器及7段显示译码器

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 一、实验目的 掌握一般性计数器的VHDL设计方法,熟悉程序文本和原理图…

鸿蒙系统笔记本产业链,华为P40或用鸿蒙 华为产业链概念股一览

众所周知,华为已经推出了全新的鸿蒙系统,这正式证明了华为越挫越勇的精神,余承东已经对外透露,要是在无法使用谷歌服务的情况下,明年推出的华为P40或用鸿蒙系统,值得关注的是,这是时候&#xff…

apache log4j_Apache log4j是领先的日志记录框架

apache log4j根据 零周转的调查中, Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙,占61%。 但是,它似乎最常与Apache Log4j一起使用,52%的调查参…

FPGA(6)--7段显示译码器的加法计数器

文章目录一、实验目的二、实验内容三、实验设计与结果四、实验思考与小结一、实验目的 在上次加法计数器仿真实验的基础上,掌握端口的引脚配置、实验箱的接线及程序的下载、调试等。 二、实验内容 1.在上次实验的基础上,编译、仿真可以进行0-99加法计…

oracle中取反_mysql 取反

云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库…

android随机匹配,基于进程调度的Android真随机数和设备特征生成方法的研究

摘要:密钥是保证Android设备安全的重要组件之一,密钥的生成与使用均需要用到随机数,生成高质量的随机数需要高熵值的随机源。另一方面,移动广告等业务对不同的Android设备提供个性化服务时,需要对智能终端进行识别,因此需要采集设备特征,而识别设备需要低熵值的信息…

FPGA(7)--有限状态机--交通灯

一、实验目的 掌握有限状态机的编程和使用方法。 二、实验内容 设计一个十字路口交通灯控制器,东西(b)、南北(a)方向有红灯、黄灯、绿灯,持续时间分别为45、5、40秒,仿真验证其功能。 三、实验设计与结果 1.整体设计思路:根…

Spring Cloud配置–外部化应用程序配置

本教程是关于Spring Cloud Config的,这里我们将研究如何在不同的应用程序中针对不同的环境(例如开发人员,本地,产品等)使用Spring Cloud Config来管理和存储分布式外部配置属性。开发一个简单的云应用程序以使用云配置…

输入法问题_「图」KB4515384再爆新问题:OOBE时中文输入法阻止创建本地账户

KB4515384可谓是近期BUG数量最多的累积更新了,继开始菜单出现严重错误、音频故障、网络适配器问题、PIN登陆系统无法使用之后,在支持文档中微软承认了在初次设置(OOBE)过程中,使用某些语言将会阻止用户创建本地账户。微软在支持文档中表示&am…

cas后端返回html直接跳转,CAS验证成功后不能跳转到登陆成功的主页面解决办法...

CAS验证成功后不能跳转到登陆成功的主页面现在部署了CAS,有一个应用,下载输入应用的URL可以正确跳转到CAS服务的登陆界面,登陆验证通过后页面却跳转到了应用的登陆界面,不能直接进入登陆成功的主页面!应用的web.xml如下CASFilterorg.jasig.cas.client.au…

FPGA(0)--quartusⅡ安装

微信公众号:创享日记 发送:quartus 获取软件安装包等 (假设光盘驱动器号为 E, 所有软件安装到 D 分区) 1.运行e:\QuartusII9.0 \ isetup.exe,直接点击“next”,一直到完成安装 2.设安装路径和目录为&#…