04-原始模型模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的原始模型模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 原始模型模式 Quarkus
1 基础知识
1.1 标准定义
原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1.2 分析和说明
原型模式是指用原型实例指定创建对象的种类,并且通过拷贝(克隆)这些原型创建新的对象。原型模式也是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类是在运行时刻指定时,可使用原型模式。原始模型模式适用于任何的等级结构。原型模式的结构如图1。原型模式的缺点是每一个类都必须配备一个克隆方法。
Prototype的角色包括客户(Client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。Prototype用来声明一个拷贝自身的接口,ConcretePrototype用来实现一个拷贝自身的操作;Client用来让一个原型拷贝自身从而创建一个新的对象。
图1 原始模型模式的标准结构图
客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
2 应用场景举例
比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的通信联系方式。所以,对于不同产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。用例见图2所示。
图2 原始模型模式的用例图
在这里可以把AbstractPrototype理解为抽象原型(Prototype)角色。CompanyBaseIntroduction是具体原型(Concrete Prototype)角色。其实现类图如下:
图3 原始模型模式的类图
原始模型实现的顺序图如图4所示,实现顺序描述:① 创建一个company实例对象;② 再新建一个departA实例对象,从company实例对象克隆过来;③ 获得departA实例对象;④ 调用departA的addSomeIntrouction方法;⑤ 显示departA的内容。
图4 原始模型模式实现顺序图
3.Quarkus的实现程序代码
Quarkus程序实现主要包括AbstractPrototype抽象类文件,CompanyBaseIntroduction类文件2个文件。其关系如图3所示。下面分别列出这2个文件的程序代码,最后列出测试代码并显示输出结果。
AbstractPrototype抽象类程序代码清单01所示。
程序代码清单01
@ApplicationScoped
public abstract class AbstractPrototype { public AbstractPrototype cloneMyself() {return this;}public void addSomeIntrouction(String topic, String content) {}public void deleteSomeIntrouction(String key) {}public void showIntrouction() { }
}
CompanyBaseIntroduction类文件程序代码清单02所示。
程序代码清单02
@ApplicationScoped
public class CompanyBaseIntroduction extends AbstractPrototype{
private Map<String, String> introductionMap = new HashMap<String, String>();public CompanyBaseIntroduction(){ }public CompanyBaseIntroduction(Map<String, String> map){introductionMap = map;}public AbstractPrototype cloneMyself(){addSomeIntrouction("公司介绍", "这是公司基本介绍"); AbstractPrototype object = new CompanyBaseIntroduction(introductionMap); return object;} public void addSomeIntrouction(String topic, String content) {introductionMap.put(topic, content); }public void deleteSomeIntrouction(String key) {if (introductionMap.containsKey(key))introductionMap.remove(key);}public void addIntrouctionMap(Map<String, String> map){introductionMap.putAll(map);}public Map<String, String> getIntroductionMap(){return introductionMap;}public void showIntrouction() {Iterator<String> it = introductionMap.keySet().iterator();String key, value;while (it.hasNext()) {key = (String) it.next();value = (String) introductionMap.get(key);System.out.println("key: " + key + "; value: " + value);}}
}
原始模型测试程序的代码清单03如下:
程序代码清单03
public class PrototypeClient implements QuarkusApplication {@ConfigProperty(name = "gof23.creationalpattern.prototype.title", defaultValue = "gof23")String title;@Inject CompanyBaseIntroduction company ; @Inject AbstractPrototype departA ; @Inject AbstractPrototype company2 ; @Overridepublic int run(String... args){System.out.println("———————" + title + "演示输出————————"); departA = company.cloneMyself();departA.addSomeIntrouction("部门A介绍", "这是部门A介绍的内容"); AbstractPrototype departB = departA.cloneMyself();departB.deleteSomeIntrouction("部门A介绍");departB.addSomeIntrouction("部门B介绍", "这是部门B介绍的内容");departB.showIntrouction();return 0;}public static void main(String... args) { Quarkus.run(PrototypeClient.class, args); }
}
原始模型测试类输出结果如下所示:
key: 部门A介绍; value: 这是部门A介绍的内容
key: 公司介绍; value: 这是公司基本介绍
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\creationalpattern\prototype”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:
git clone https://gitee.com/rengang66/quarkus-sample-gof23.git
5 扩展和说明
在java中已经在语言层次上支持了原始模型模式。在java语言所有的类的顶级父类都是java.lang.Object类。java.lang.Object类有一个clone()方法,该方法就是实现创建并返回此对象的一个副本。
参考文献
[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] 唐慕瑾 徐伯庆 孙国强. Java类的动态装载机制及其在设计模式中的应用. 上海理工大学学报,2004.26(1), 80-84.
[7] 唐伟 曲俊华. 基于JAVA的原型对象池的设计. 中国电力教育,2005.(z2), 207-211.
[8] 万波 张焰 罗治强. 设计模式在Drawcli程序中的应用. 计算机应用与软件,2003.20(8), 12-13,84.
[9] 贺志国 曾俊 陈天泽 匡纲要. 设计模式在标图系统中的综合应用. 计算机应用研究,2005.22(9), 176-179.
[10] 侯晓辉 陈堃銶 贾娟 杨清清. 基于设计模式的数据库出版系统的框架模型. 小型微型计算机系统,2004.25(11), 2044-2048.
[11] Quarkus官网. https://quarkus.io/
04-原始模型模式Quarkus实现相关推荐
- 15-责任链模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的责任链模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 责任链模式 Quarkus 1 基 ...
- 03-建造模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的建造模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 建造模式 Quarkus 1 基础知 ...
- 16-命令模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的命令(Command)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 命令模式 Quar ...
- 08-合成模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的合成模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 合成模式 Quarkus 1 基础知 ...
- 12-代理模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的代理模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 代理模式 Quarkus 1 基础知 ...
- 18-调停者模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的调停者模式,并用Quarkus程序代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 调停者模式 Quarkus 1 基 ...
- 02-抽象工厂模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的抽象工厂模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 抽象工厂模式 Quarkus 1 ...
- 07-桥梁模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的桥梁模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 桥梁模式 Quarkus 1 基础知 ...
- 01-工厂模式Quarkus实现
摘要:本文用一个实例场景描述Gof 23设计模式中的工厂(Factory Method)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 工厂 ...
最新文章
- Cannot input a tensor of dimension other than 0 as a scalar argument
- android listview 不显示_ListView详细介绍与使用
- antd + react model自定义footer_更骚的create-react-app开发环境配置craco
- nginx 响应服务器静态,405 Not Allowed,nginx静态文件响应post请求
- 计算机网络课程设计之TELNET 终端设计与实现
- Spring框架学习笔记10:基于XML配置方式SSM框架西蒙购物网
- Spark源码分析之Task
- ​苹果WWDC20确定6月22日线上举办;任天堂遭史上最大规模黑客攻击 ;Inkscape 1.0 发布 | 极客头条...
- java日期加一天_Java 关于日期加一天(日期往后多一天)
- vs 2015 加载该页时出错。 解决方案
- BOW和LSH的一点理解
- Java静态变量小感
- 中兴zxr10路由器重启命令_zxr10维护常用命令
- BLP读书笔记(一)——通过shell访问终端模式
- BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
- 中外大都市人口密度的数据比较
- php泛目录站群系统,php泛目录站群
- Lenovo笔记本各类型触控板,触摸部分只能移动无法点击的问题汇总
- UBLOX板卡基础设置--F9P板卡配置(基准站和流动站)
- ubuntu无法上网