1. 緣起:
假設我們的訂單系統需要管理所有未處理的訂單,而客人經常需要查詢屬于自己的未處理的訂單列表。另外,可能客服人員也需要根據訂單 ID 迅速地找到對應的未處理訂單。基于第一個需求,我們就可以將未處理的訂單依據客人的帳號進行分組管理。
我設計了 ESBasic.ObjectManagement.Managers.IGroupingObjectManager 分組對象管理器來完成對對象進行分組管理的功能。
分組對象管理器的形象示意圖如下:
2. 適用場合:
當你的需求覆蓋以下條件時,就非常合適使用分組對象管理器:
(1) 被管理的每個對象都有唯一的 ID 。
(2) 被管理的對象可以依據某個標志進行分組。
(3) 經常需要根據分組標志來查詢符合該標志的對象列表。
(4) 經常需要向管理器中增加 / 移除被分組的對象。
(5) 經常需要根據對象 ID 快速查找對應的對象。
3 .設計思想與實現
IGroupingObjectManager 的接口定義如下:
{
/// <summary>
/// Add如果已經存在同ID的對象,則用新對象替換舊對象。
/// </summary>
void Add(TObjectobj);
void Remove(TObjectKeyobjectID);
/// <summary>
/// Clear清除所有對象與分組。
/// </summary>
void Clear();
TObjectGet(TObjectKeyobjectID);
int TotalObjectCount{ get ;}
/// <summary>
/// GetCountOfGroup獲取某個分組中的對象的個數。
/// </summary>
int GetCountOfGroup(TGroupKeygroupID);
/// <summary>
/// GetAllObjectsCopy獲取管理器中的所有對象列表。
/// </summary>
IList < TObject > GetAllObjectsCopy();
/// <summary>
/// GetGroupsCopy獲取所有的分組標志列表。
/// </summary>
IList < TGroupKey > GetGroupsCopy();
/// <summary>
/// GetObjectsCopy獲取某個分組中的所有對象的列表。
/// </summary>
IList < TObject > GetObjectsCopy(TGroupKeygroupID);
}
這個接口包含有三個泛型參數: TGroupKey 、 TObjectKey 和 TObject 。
TObject 是被管理的對象的類型。
TObjectKey 是被管理的對象的 ID 的類型。
TGroupKey 是對被管理的對象進行分組的標志的類型。
另外,該接口的泛型參數還有一個約束,即 TObject 必須從 IGroupingObject 接口繼承,以表明自己是一個可以被分組的對象。
IGroupingObject 接口很簡單,其定義如下:
{
TObjectKeyID{ get ;}
TGroupKeyGroupID{ get ;}
}
觀察這個接口告訴我們,只要一個對象有唯一的 ID ,并且有分組的標志,那么這個對象就可以被對象分組管理器進行管理了。
關于 GroupingObjectManager 的實現要注意以下幾點:
(1) GroupingObjectManager 使用了兩個字典集合: objectDictionary 、 groupDictionary 。 objectDictionary 用于存儲所有被管理的對象。 groupDictionary 用于管理所有的分組,而且 groupDictionary 的 Value 又是另外一個字典,用于存儲屬于這一分組的所有對象。
(2) GroupingObjectManager 的實現是線程安全的,所以可以在多線程的環境中使用。我們對其內部的兩個字典集合都進行了加鎖控制。
(3) Add 方法采用的也是覆蓋原則――如果同 Key 的對象已經存在,則用新對象覆蓋舊的對象。
4. 使用時的注意事項
當調用 Remove 方法刪除的是某個分組中的最后一個對象時,在該對象被刪除后,對應的分組將也會被刪除。所以,管理器中不會存在“空”的歷史分組。也就是說, GetGroupsCopy 方法返回的分組標志列表中的每個分組標志在管理器中對應的分組都包含至少一個被分組對象。
5. 擴展
分組對象管理器 IGroupingObjectManager 暫時沒有任何擴展。
注:ESBasic源碼可到
http://esbasic.codeplex.com/
下載。
ESBasic討論:37677395
ESBasic開源前言
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
