去除对象中的类型集合
一般來說,當某一個對象有多個集合類型的子元素時,我們都會給每個子元素創(chuàng)建一個集合對象來承載子元素,類似于:
?
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,展現(xiàn)類型為PoolDiagram,對應模型為之前的Process對象;
Task1,展現(xiàn)類型為UserTaskDiagram,對應模型為UserTask;
Task2,展現(xiàn)類型為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類是保持不變的,相關的增加刪除邏輯也會保存相對固定。
經過以上實現(xiàn),之前的增加刪除邏輯變?yōu)?#xff1a;
Process.addChildElement(userTask);
Process.removeChildElement(manualTask);
轉載于:https://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html
總結
以上是生活随笔為你收集整理的去除对象中的类型集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抵押车多少钱啊?
- 下一篇: 修改窗口图标 AfxRegisterWn