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

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;
}

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

图中:

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.add(manualTask)

......

......

删除:

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

Else if(diagram is ManualTaskDiagram)Process.ManualTaskDiagram.remove(manualTask)

......

......

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

具体方案如下:

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

去除对象中的类型集合相关推荐

  1. 对BeanCopier拷贝对象中List类型属性的思考

    背景 最近开发接口过程中,使用BeanCopier拷贝对象,当对象中嵌套自定义对象类型属性的时候, 如果对象名称一致,但是对象类型不一致,拷贝的时候,该属性是会被忽略的,但是当对象中嵌套List集合类 ...

  2. @RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验

    标题太长有木有?主要是为了把问题描述清楚,免得进错文章. 问题描述 昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题. 要求输入的日期格式是:yyyy-MM-dd HH:mm:ss,Vo ...

  3. java set类_java中set类型集合解析(一)

    集合的体系: -----------------Collection  单例集合接口 ----------------------List 如果实现的是List接口的集合,具备有序,可重复的特性 -- ...

  4. python将bytes转为对象_Python3中bytes类型转换为str类型

    Python3中bytes类型转换为str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.P ...

  5. python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....

    Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...

  6. java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象

    我的需求:计算字符串集合中"数值"出现的次数,然后在for循环中计算"数值"及出现的次数 解决方案: 1.使用collections类中的frequency(集 ...

  7. java去重复的集合_如何去除Java中List集合中的重复数据

    1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ f ...

  8. 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )

    文章目录 前言 一.订阅类-订阅方法缓存集合 二.事件类型-订阅者集合 三.订阅对象-事件类型集合 前言 首先声明几个数据结构 , 参考 [EventBus]EventBus 源码解析 ( 注册订阅者 ...

  9. .NET 中创建支持集合初始化器的类型

    对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰.至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些. 本文将编写一个类型,可以使用集合初始化器构造这个类型.不只是添 ...

最新文章

  1. JS中eval处理JSON数据 为什么要加括号
  2. CentOS 生成SSH-KEY
  3. log4j.xml 精选的log4j.xml文档,比较详细,网上的版本很多,这个版本相对而言比较完整...
  4. 164. Leetcode 435. 无重叠区间 (贪心算法-贪心区间)
  5. 去中心化交易所前路明朗,基于EOS的去中心化交易所力拔头筹
  6. boost::io::ostream_joiner和boost::io::make_ostream_joiner用法的测试程序
  7. 思科AP-什么是COS AP?
  8. 软件项目组织管理(七)项目成本管理
  9. CDOJ 29 飞镖(dart) 解题报告
  10. 3.剑指Offer --- 高质量的代码
  11. V-rep中导入机械臂模型并验证
  12. 大数据技术之Hive 第8章 函数 系统内置函数
  13. (一)线段树入门--补充与其他模板
  14. Eigen优化及并行性能测试
  15. 计算机专业老师教案,技能大赛-2015年全国中等职业学校计算机应用基础及计算机类专业课程“创新杯”教师信息化教学设计和说课比赛总结...
  16. 一WAN多拨(一号多拨)实验
  17. 计算机主板的结构平面草图,10分钟浓缩10年 教你看懂主板基本结构
  18. springboot集成flink-cdc
  19. 违规对店铺综合质量评分、个性化推荐影响 以及标题 、修改sku的影响
  20. 读计算机应用需要哪些条件,邓迪大学计算机应用本科申请条件.pdf

热门文章

  1. 分享一个不错的表格样式
  2. 计算机活动宣传稿,畅想科技,创造梦想 ——东华大学计算机科学与技术学院第十一届图灵科技文化节通讯稿...
  3. c++学习之const成员变量与成员函数
  4. 思考产品架构的4个视角:业务、场景、数据/功能、实现
  5. 微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)
  6. 深入了解区块链技术及其常见误区
  7. 异想维度 java_Java实现多字段(维度)复杂排序
  8. 物资申请php,php学生捐赠物品管理系统
  9. java 线程池技术_Java线程池技术以及实现
  10. java 三大集合_java中的三大集合入门笔记(简单实用)