14-模板方法模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的模板方法模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 模板模式 Quarkus
1 基础知识
1.1 标准定义
模板方法(Template Method)模式标准定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1.2 分析和说明
模板方法(Template Method)模式属于行为型设计模式。模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。也即是先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
模板方法(Template Method)模式结构如图1所示,其角色包括抽象模版(Abstract Class)角色和具体模版(Concrete Class)角色。
图1 模板方法模式结构
抽象模版(Abstract Class)角色有如下的责任:定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
具体模版(Concrete Class)角色有如下的责任:实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
2 应用场景举例
比如公司研发项目的过程是可行性研究、需求分析、总体设计、详细设计、系统编码、系统测试、系统部署、系统维护等标准过程。这些可以形成一个接口,但是为了简化工作,可以形成一个抽象的模板类。把这些步骤全部都实现,如果不能实现,那就使用抽象方法。现在有某给具体项目,其中的总体设计和详细设计与模板不同,这就可以采用模板方法模式。用例见图2所示。
图2 模板方法模式用例图
在这里可以把ProjectProcessTemplate抽象类理解为抽象模版(Abstract Class)角色。ProjectA类和 ProjectB类是具体模版(Concrete Class)角色。其结构类图如图3所示。ProjectA类和 ProjectB类都继承ProjectProcessTemplate抽象类并实现ProjectProcess接口。
图3 模板方法模式类图
模板方法模式实现顺序图见图4,实现顺序描述:① 基于ProjectA创建一个project1对象;② 调用project1对象的doActualWork方法,形成project1对象的项目过程;③ 调用project1对象的showProcess方法显示project1对象的项目过程。
图4 模板方法模式实现顺序图
ProjectProcessTemplate抽象类定义一个操作中的算法的骨架,具体实现步骤延迟到子类ProjectA类和 ProjectB类中。
3.Quarkus的实现程序代码
Quarkus程序实现主要包括ProjectProcess接口文件,ProjectProcessTemplate抽象类文件,ProjectA类文件和ProjectB类文件等4个文件。其关系如图3所示。下面分别列出这4个文件的程序代码,最后列出测试代码并显示输出结果。
ProjectProcess接口程序代码清单01所示。
程序代码清单01
public interface ProjectProcess { //可行性分析过程public void feasibilityProcess(String content);//技术交流过程public void technicalDiscussionProcess(String content);//投标过程public void bidProcess(String content);//需求调研和分析过程public void requirementProcess(String content);//设计过程public void designProcess(String content);//编码过程public void programProcess(String content);//测试过程public void testProcess(String content);//部署和实施过程public void deploymentProcess(String content);//维护过程public void maintenanceProcess(String content);public void doActualWork(); public void showProcess();
}
ProjectProcessTemplate抽象类程序代码清单02所示。
程序代码清单02
public abstract class ProjectProcessTemplate { public Map<String,String> processMap = new HashMap<String,String>();//可行性分析过程public void feasibilityProcess(String content){processMap.put("feasibilityProcess", content);}//技术交流过程public void technicalDiscussionProcess(String content){processMap.put("technicalDiscussionProcess", content);}//投标过程public void bidProcess(String content){processMap.put("bidProcess", content);}//需求调研和分析过程public void requirementProcess(String content){processMap.put("requirementProcess", content);}//设计过程public void designProcess(String content){processMap.put("designProcess", content);}//编码过程public void programProcess(String content){processMap.put("programProcess", content);}//测试过程public void testProcess(String content){processMap.put("testProcess", content);}//部署和实施过程public void deploymentProcess(String content){processMap.put("deploymentProcess", content);}//维护过程public void maintenanceProcess(String content){processMap.put("maintenanceProcess", content);}public void showProcess(){String key = null;String value = null; Iterator<String> it = processMap.keySet().iterator();while (it.hasNext()){key = it.next();value = processMap.get(key);System.out.println("过程: " + key + "; 内容: " + value );}}
}
ProjectA类继承ProjectProcessTemplate抽象类并实现ProjectProcess接口,其程序代码清单03所示。
程序代码清单03
@ApplicationScoped
public class ProjectA extends ProjectProcessTemplate implements ProjectProcess{public void doActualWork(){ feasibilityProcess("定制可行性研究"); technicalDiscussionProcess("定制技术交流"); bidProcess("定制投标"); requirementProcess("定制需求");designProcess("定制设计");programProcess("定制编码"); testProcess("定制测试"); deploymentProcess("定制部署"); maintenanceProcess("定制维护"); }
}
ProjectB类继承ProjectProcessTemplate抽象类并实现ProjectProcess接口,其程序代码清单04所示。
程序代码清单04
@ApplicationScoped
public class ProjectB extends ProjectProcessTemplate implements ProjectProcess{public void doActualWork(){ requirementProcess("定制需求");designProcess("定制设计");programProcess("定制编码"); testProcess("定制测试"); deploymentProcess("定制部署"); maintenanceProcess("定制维护"); }
}
模板方法模式测试程序的代码清单05如下:
程序代码清单05
public class TemplateClient implements QuarkusApplication{@ConfigProperty(name = "gof23.behavioralpattern.template.title", defaultValue = "gof23")String title;@Inject ProjectA project1; @Inject ProjectB project2;@Overridepublic int run(String... args) { System.out.println("——————" + title + "演示输出————————"); System.out.println("——————projectA的过程——————"); project1.doActualWork();project1.showProcess();System.out.println("——————projectB的过程——————"); project2.doActualWork();project2.showProcess(); return 0;}public static void main(String... args) {Quarkus.run(TemplateClient.class, args);}
}
模板方法模式测试类输出结果如下所示:
——————projectA的过程——————
过程: deploymentProcess; 内容: 定制部署
过程: maintenanceProcess; 内容: 定制维护
过程: requirementProcess; 内容: 定制需求
过程:designProcess; 内容: 定制设计
过程: programProcess; 内容: 定制编码
过程: bidProcess;> 内容: 定制投标
过程: testProcess; 内容: 定制测试
过程: feasibilityProcess; 内容: 定制可行性研究
过程: technicalDiscussionProcess; 内容: 定制技术交流
——————projectB的过程——————
过程:> deploymentProcess; 内容: 定制部署
过程: maintenanceProcess; 内容: 定制维护
过程:> requirementProcess; 内容: 定制需求
过程: designProcess; 内容: 定制设计
过程:> programProcess; 内容: 定制编码
过程: testProcess; 内容: 定制测试
4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。
git clone https://github.com/rengang66/quarkus-sample-gof23.git
这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\behavioralpattern\template”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:
git clone https://gitee.com/rengang66/quarkus-sample-gof23.git
参考文献
[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 肖保良 宋东 赵胜. 基于模式的ATS领域框架研究. 计算机测量与控制,2007.15(9), 1144-1147.
[7] 顾颖 徐良贤 贾银军. JUnit设计模式分析和应用. 计算机工程,2004.30(B12), 178-179,182.
[8] 戴建国 郭理 曹传东. JUnit框架剖析. 计算机与数字工程,2008.36(8), 43-45,135.
[9] 吴信永 宋东 刘飞. 基于构件技术的通用ATS框架设计. 计算机测量与控制,2008.16(2), 141-143,155.
[10] 王莉 汤灵愈. 基于设计模式的遗传算法类库的框架模型. 科技创新导报,2008.(3), 7-8.
[11] 刘繁艳. 基于JAVA的模板设计模式研究. 电脑知识与技术:学术交流,2008.(7), 60-62.
[12] 任勇军 王志坚. 模板方法模式及其在Java2D中的应用. 计算机与现代化,2003.(9), 13-15.
[13] Quarkus官网. https://quarkus.io/
14-模板方法模式Quarkus实现相关推荐
- 14、模板方法模式(Template Method)
解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1-n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用. 先看个关系图 ...
- JAVA设计模式(14) —行为型模板方法模式(Template Method)
1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...
- 设计模式之模板方法模式(Template Method)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用
一.抽象类概念和作用 抽象类 Java中可以定义没有方法体的方法,该方法由子类来具体实现. 该没有方法体的方法我们称之为抽象方法,含有抽 ...
- 《JAVA与模式》之模板方法模式
http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 英文定义更容易理解: defines the skeleton ...
- javascript设计模式-模板方法模式(Template)
1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...
- 设计模式(二)模板方法模式
1.模版方法模式简介 模版方法模式介绍 在软件开发中,有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤并不固定,存在可变性.为了提高代码的复用性和系统的灵活性,可以使 ...
- 《Head First设计模式》第八章笔记-模板方法模式
模板方法模式 之前所学习的模式都是围绕着封装进行,如对象创建.方法调用.复杂接口的封装等,这次的模板方法模式将深入封装算法块,好让子类可以在任何时候都将自己挂接进运算里. 模板方法定义:模板方法模式在 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]...
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- C#设计模式---模板方法模式(Template Method Pattern)
一.目的 模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码. 二.定义 模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现. 模板方法使得子类在 ...
最新文章
- 融合AI与大数据技术,腾讯教育发布智能作业灯
- 中过滤记录中时间_水肥一体化中常见的过滤器
- java客户端操作zookeeper:对某个节点进行持续监听代码示例
- 李洋疯狂C语言之break和continue的区别
- 小皮面板有php环境吗,体验phpStudy小皮面板创建LAMP/LNMP系统和建站图文
- Linux系统安装MySql步骤及截屏
- FUSE—用户空间文件系统
- 半边数据结构(The_Half-Edge_Data_Structure)
- original:,tool:AAPT
- 微信开发者工具使用less
- 软件测试面试题(编程算法题)
- vue-pdf 通过文件流预览pdf文件
- Mac修改hosts方法
- Android开发丶调用百度地图进行导航
- 飞鸽TCP/IP 10106错误解决
- 《tensorflow实战》6——强化学习之策略网络
- 3. pandas基础
- 易快报创始人兼CEO马春荃:数智化时代扑面而来,多维度重构企业财智领域
- ReactNative中国省-市-区WheelPicker组件
- 【以太坊】什么是雷电网络 Raiden network