分享
 
 
 

在组合模式中实现访问者(Visitor)模式

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

本文从一个给定的实现了组合(Composite)模式的例子开始,说明怎么在这个数据结构上实现业务逻辑代码。依次介绍了非面向对象的方式、在组合结构中加入方法、使用访问者(Visitor)模式以及用改进后的访问者(Visitor)模式来实现相同的业务逻辑代码,并且对于每种实现分别给出了优缺点。

读者定位于具有java程序开发和设计模式经验的开发人员。

读者通过本文可以学到如何在组合(Composite)模式中实现各种不同的业务方法及其优缺点。

组合(Composite)模式

组合模式是结构型模式中的一种。GOF的《设计模式》一书中对使用组合模式的意图描述如下:将对象组合成树形结构以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

组合模式应用广泛。根据GOF中对组合模式的定义,Composite模式一般由Component接口、Leaf类和Composite类组成。现在需要对一个软件产品治理系统的实体建模:某公司开发了一系列软件集(SoftwareSet),包含了多种品牌(Brand)的软件产品,就象IBM提供了Lotus、WebsPhere等品牌。每个品牌下面又有各种产品(PRodUCt),如IBM的Lotus下面有Domino Server/Client产品等。建模后的类图如下(代码可以参见随本文带的附件中,包com.test.entity下所有的源文件):

如图所示:

(1)接口SoftwareComponent就是对应于组合模式中的Component接口,它定义了所有类共有接口的缺省行为

(2)AbsSoftwareComposite类对应于Composite类,并且是抽象类,所有可以包含子节点的类都扩展这个类。这个类的主要功能是用来存储子部件,实现了接口中的方法,部分可以重用的代码写在此类中

(3)SoftwareSet类继续于AbsSoftwareComposite类,对应于软件集,软件集下直接可以包含品牌(Brand),也可以直接包含不属于任何品牌的产品(Product)

(4)Brand类继续于AbsSoftwareComposite类,对应于品牌,包含了品牌名属性,并且用来存储Product类的实例

(5)Product类就是对应的Leaf类,表示叶子节点,叶子节点没有子节点

用不同的方法实现业务逻辑

数据结构建立好之后,需要在这个数据结构上添加方法实现业务逻辑。比如现在的这个例子中,有这样的需求:给定一些用户选择好的产品,需要计算出这些选中后软件的总价格。下面开始介绍如何使用各种不同的方法来实现这个业务逻辑。

非面向对象的编程方式

这种方式下,编程思路最简单:遍历SoftwareSet实例中的所有节点,假如遍历到的当前对象是Product的话就累加,否则继续遍历下一层直到全部遍历完毕。代码片断如下:

/**

* 取得某个SoftwareComponent对象下面所有Product的价格

* @param brand

* @return

*/

public double getTotalPrice(SoftwareComponent softwareComponent) {

SoftwareComponent temp = softwareComponent;

double totalPrice = 0;

//假如传入的实例是SoftwareSet的类型

if (temp instanceof SoftwareSet) {

Iterator it = ((SoftwareSet) softwareComponent).getChilds()

.iterator();

while (it.hasNext()) {//遍历

temp = (SoftwareComponent) it.next();

//假如子对象是Product类型的,直接累加

if (temp instanceof Product) {

Product product = (Product) temp;

totalPrice += product.getPrice();

} else if (temp instanceof Brand) {

//假如子对象是Brand类型的,则遍历Brand下面所有的产品并累加

Brand brand = (Brand) temp;

totalPrice += getBrandPrice(brand);

}

}

} else if (temp instanceof Brand) {

//假如传入的实例是SoftwareSet的类型,则遍历Brand下面所有的产品并累加

totalPrice += getBrandPrice((Brand) temp);

} else if (temp instanceof Product) {

//假如子对象是Product类型的,直接返回价格

return ((Product) temp).getPrice();

}

return totalPrice;

}

/**

* 取得某个Brand对象下面所有Product的价格

* @param brand

* @return

*/

private double getBrandPrice(Brand brand) {

Iterator brandIt = brand.getChilds().iterator();

double totalPrice = 0;

while (brandIt.hasNext()) {

Product product = (Product) brandIt.next();

totalPrice += product.getPrice();

}

return totalPrice;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有