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 ;	
	
	@Override
    public 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值