去除对象中的类型集合

一般来说,当某一个对象有多个集合类型的子元素时,我们都会给每个子元素创建一个集合对象来承载子元素,类似于:

 

public class Process
{
public var isExecutable:Boolean;
public var refLaneSet:LaneSet;
public var startEventList:ArrayList;
public var endEventList:ArrayList;
public var taskList:ArrayList;
public var serviceTaskList:ArrayList;
public var sendTaskList:ArrayList;
public var receiveTaskList:ArrayList;
public var userTaskList:ArrayList;
}

一般来说,这是没什么问题的。但是某些情况下,例如在图形化与结构化文档之间进行转化时,这样做有很多弊端。如图:

 2011042815130778.jpg

图中:

Participant1,展现类型为PoolDiagram,对应模型为之前的Process对象;

Task1,展现类型为UserTaskDiagram,对应模型为UserTask

Task2,展现类型为ManualTaskDiagram,对应模型为ManualTask

我们每向Participant1中增加一个UserTaskDiagram或者ManualTaskDiagram时,都需要向对应的Process中增加UserTask或者ManualTask对象;删除时也是如此。这时候就需要通过判断图形的类型来向相关的模型列表中增加模型对象,删除也需要判断。在类型比较少的时候,这样做比较简单,但是如果类型比较多的时候,特别是类型数量是一个变化点的时候,这种处理方式局限性就很大了,每次变动,都会对既有的代码造成影响。具体的代码可能类似于:

增加:

If(diagram is UserTaskDiagram) Process.UserTaskList.add(userTask)

Else if(diagram is ManualTaskDiagram)Process.ManualTaskDiagram.addmanualTask

......

......

删除:

If(diagram is UserTaskDiagram) Process.UserTaskList.remove(userTask)

Else if(diagram is ManualTaskDiagram)Process.ManualTaskDiagram.removemanualTask

......

......

即使我们将这段代码封装到一个地方,这个地方在新类型增加时也需要改变,有没有一种方法可以在类型增加时不改变既有代码呢?答案是肯定的。

具体方案如下:

 

public class ContainerElement
{
private var _typeListDic:Dictionary=new Dictionary();

public function addChildElement(element:BPMNElement):void
{
if(!_typeListDic[element.type])
_typeListDic[element.type]
=new ArrayCollection();
_typeListDic[element.type].addItem(element);
}

public function removeChildElement(element:BPMNElement):void
{
if(_typeListDic[element.type])
{
var index:
int=_typeListDic[element.type].getItemIndex(element);
if(index!=-1)
{
_typeListDic[element.type].removeItemAt(index);
}
}
}

public function getChildElements(classInfo:Class):ArrayCollection
{
if(!_typeListDic[classInfo])
_typeListDic[classInfo]
=new ArrayCollection();
return _typeListDic[classInfo];
}
}

public class Process extends ContainerElement
{
public var isExecutable:Boolean;
public var laneSet:LaneSet;

public function Process(){}

public function get type():Class
{
return Process;
}
}

上面的代码将所有的类型列表相关的操作封装在ContainerElement中,该类维护一个类型和对象集合的映射关系,从而将相关的判断逻辑从代码中去除。再增加或者去除新类型时我们的process类是保持不变的,相关的增加删除逻辑也会保存相对固定。

经过以上实现,之前的增加删除逻辑变为:

Process.addChildElement(userTask);

Process.removeChildElement(manualTask);

转载于:https://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html

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

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

相关文章

服务器安装centos6 linux,CentOS6.5安装详细教程,手把手教你安装Linux操作系统(CentOS6.5)...

CentOS6.5安装详细教程1、准备好CentOS-6.5.iso文件,并刻录到光盘中,放入光驱,重启服务器,修改BIOS为光驱启动,之后开始进入安装:2、按任意键,进入引导菜单。按上下键,移动光标&…

Vestigium-Google CodeJam 2020资格回合问题1解决方案

Problem statement: 问题陈述: Vestigium means "trace" in Latin. In this problem we work with Latin squares and matrix traces. Vestigium在拉丁语中表示“痕迹”。 在此问题中,我们使用拉丁方和矩阵迹线。 The trace of a square mat…

装修(43天,安装新家具啦)

装修(43天,安装新家具啦) 昨天保洁公司的来做了保洁.说好是9点钟让我去开门的,可他们却10点才到,原来听错地点了.三个人,从早上10开始做,到下午六点我去的时候,还没有做完,大概要做到七点.才150元钱,也真难为他们,还有一部分是公司的.效果觉得还是一般,有些地方还是不干净.可能…

dbms和sql_DBMS | 并发控制和各种并发控制方法

dbms和sql并发控制 (Concurrency Control) The concurrency control is the coordination of the simultaneous execution of a transaction in a multiuser database system. The concurrency control can ensure the serializability of the transaction in a multiuser data…

修改窗口图标 AfxRegisterWndClass()

LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,HCURSOR hCursor 0,HBRUSH hbrBackground 0,HICON hIcon 0 ); 可以简单修改一个窗口的注册类,当然也可以用SetWindowsLong()来实现。转载于:https://www.cnblogs.com/magic-cube/archive/2011/05/05/2038…

linux停止ssh服务的命令,开启、关闭、查看SSH服务

一、临时启用SSH服务1、通过SSH服务器的启动脚本文件启动SSH服务通过OpenSSH服务器的脚本文件“/etc/rc.d/init.d/sshd”启动SSH服务,命令执行如下。/etc/rc.d/init.d/sshd start命令执行后, SSH服务开始运行。2、使用Linux下的service命令启动SSH服务使…

XCHE命令

功能: 交换数据,交换两个操作数内容 形式: xche reg,reg xche reg,mem xche mem,regreg:寄存器;mem:内存单元 比如: xche eax,ebx;交换eax和ebx的内容 xche eax,[ebx]

软件测试经典网站(转)

软件测试经典网站网址简介http://bdonline.sqe.com/一个关于网站测试方面的网页,对这方面感兴趣的人可以参考http://citeseer.nj.nec.com/一个丰富的电子书库,内容很多,而且提供著作的相关文档参考和下载,是作者非常推荐的一个资料参考网站http://groups.yahoo.com/group/LoadR…

ai人工智能在手机的应用_强化学习在人工智能中的应用

ai人工智能在手机的应用The reinforcement learning is being used in many Intelligent Systems and the developers are seeing a great scope in it for current and future developments in the field of computers and robotics. This is because, the Reinforcement Lear…

LEA指令

功能:取偏移地址 格式: LEA reg,memreg:寄存器;mem:内存单元 例如: LEA AX,[1000H]将1000源操作数[1000H]的偏移地址1000H送到AX中。 理解的时候可将[]去掉,等同于: m…

参考站点

26个杰出的jQuery幻灯片插件http://woshao.com/article/6807a76a43d611e081e1000c2959fd2a/周公的专栏http://blog.csdn.net/zhoufoxcn/ W3SCHOOL在线教程http://www.w3school.com.cn/jQuery API 中文版http://www.css88.com/jqueryapi在ASP.NET中使用Highcharts js图表http://…

linux多进程通过中断实现,Linux驱动中断上下文中会发生什么结果实验测试

一、前言每一个Linux驱动工程师都知道这样一个准则:在中断上下文中不能睡眠。但是为什么interrupt context中不能调用导致睡眠的kernel API呢?如果驱动这么做会导致什么样的后果呢?这就是本文探讨的主题。为了理解这个主题,我们设…

'unsigned char'-C编程中的声明,赋值和用法

char is a data type in C programming language which can store value from -128 to 127. It generally used to store character values. char是C编程语言中的数据类型,可以存储从-128到127的值 。 它通常用于存储字符值。 unsigned is a qualifier which is us…

cmp指令

功能:比较 格式: CMP destination,sourceCMP 指令比较整数。字符代码也是整数,因此可以用 CMP 指令。 如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系 如果比较的是两个有符号数,则符…

游戏后的迷茫

9月份花了很多时间耐下心的玩了一个游戏——三国志11,这个是我继三国5以后耐下心玩得最多的一个游戏了,也是2年来耐下心玩得最多的游戏。现在是不是真的太浮躁了。连玩游戏都耐不下心。每天的泡论坛,看电影,下载,刻录的…

linux下获取时间的函数

相关函数 time,ctime,gmtime,localtime //--------------------------------------------------------------------------------------------------------------------------------------------------------// asctime(将时间和日…

linux 内核配置 dns,linux bind dns简单配置

操作系统版本:[roottest ~]# cat /etc/issueRed Hat Enterprise Linux AS release 4 (Nahant Update 4)Kernel r on an m内核:[roottest ~]# uname -aLinux test 2.6.9-42.EL #1 Wed Jul 12 23:16:43 EDT 2006 i686 i686 i386 GNU/Linux[roottest ~]#需要…

鸡兔同笼问题

已知鸡兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出No answer。 样例输入:①14 32 ② 10 16 样例输出:①12 2 ②No answer 【分析】 设鸡有a只,兔有b只&#xff0c…

两个人 三声叹 一钵泪

寂寞的人,流下的泪珠是单数的 转载于:https://www.cnblogs.com/aque1984/archive/2006/10/02/520282.html

散列碰撞_散列中的碰撞和碰撞解决技术

散列碰撞Prerequisite: Hashing data structure 先决条件: 哈希数据结构 碰撞 (Collisions) Hash functions are there to map different keys to unique locations (index in the hash table), and any hash function which is able to do so is known as the per…