日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ESBasic 可復用的.NET類庫(13) -- 分組對象

系統(tǒng) 1972 0

1. 緣起:

假設我們的訂單系統(tǒng)需要管理所有未處理的訂單,而客人經(jīng)常需要查詢屬于自己的未處理的訂單列表。另外,可能客服人員也需要根據(jù)訂單 ID 迅速地找到對應的未處理訂單。基于第一個需求,我們就可以將未處理的訂單依據(jù)客人的帳號進行分組管理。

我設計了 ESBasic.ObjectManagement.Managers.IGroupingObjectManager 分組對象管理器來完成對對象進行分組管理的功能。

分組對象管理器的形象示意圖如下:

ESBasic 可復用的.NET類庫(13) -- 分組對象管理器 IGroupingObjectManager

2. 適用場合:

當你的需求覆蓋以下條件時,就非常合適使用分組對象管理器:

(1) 被管理的每個對象都有唯一的 ID

(2) 被管理的對象可以依據(jù)某個標志進行分組。

(3) 經(jīng)常需要根據(jù)分組標志來查詢符合該標志的對象列表。

(4) 經(jīng)常需要向管理器中增加 / 移除被分組的對象。

(5) 經(jīng)常需要根據(jù)對象 ID 快速查找對應的對象。

3 .設計思想與實現(xiàn)

IGroupingObjectManager 的接口定義如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public interface IGroupingObjectManager < TGroupKey,TObjectKey,TObject > where TObject: IGroupingObject < TGroupKey,TObjectKey >
{
/// <summary>
/// Add如果已經(jīng)存在同ID的對象,則用新對象替換舊對象。
/// </summary>
void Add(TObjectobj);

void Remove(TObjectKeyobjectID);

/// <summary>
/// Clear清除所有對象與分組。
/// </summary>
void Clear();

TObjectGet(TObjectKeyobjectID);

int TotalObjectCount{ get ;}

/// <summary>
/// GetCountOfGroup獲取某個分組中的對象的個數(shù)。
/// </summary>
int GetCountOfGroup(TGroupKeygroupID);

/// <summary>
/// GetAllObjectsCopy獲取管理器中的所有對象列表。
/// </summary>
IList < TObject > GetAllObjectsCopy();

/// <summary>
/// GetGroupsCopy獲取所有的分組標志列表。
/// </summary>
IList < TGroupKey > GetGroupsCopy();

/// <summary>
/// GetObjectsCopy獲取某個分組中的所有對象的列表。
/// </summary>
IList < TObject > GetObjectsCopy(TGroupKeygroupID);
}

這個接口包含有三個泛型參數(shù): TGroupKey TObjectKey TObject

TObject 是被管理的對象的類型。

TObjectKey 是被管理的對象的 ID 的類型。

TGroupKey 是對被管理的對象進行分組的標志的類型。

另外,該接口的泛型參數(shù)還有一個約束,即 TObject 必須從 IGroupingObject 接口繼承,以表明自己是一個可以被分組的對象。

IGroupingObject 接口很簡單,其定義如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public interface IGroupingObject < TGroupKey,TObjectKey >
{
TObjectKeyID{
get ;}
TGroupKeyGroupID{
get ;}
}

觀察這個接口告訴我們,只要一個對象有唯一的 ID ,并且有分組的標志,那么這個對象就可以被對象分組管理器進行管理了。

關于 GroupingObjectManager 的實現(xiàn)要注意以下幾點:

(1) GroupingObjectManager 使用了兩個字典集合: objectDictionary groupDictionary objectDictionary 用于存儲所有被管理的對象。 groupDictionary 用于管理所有的分組,而且 groupDictionary Value 又是另外一個字典,用于存儲屬于這一分組的所有對象。

(2) GroupingObjectManager 的實現(xiàn)是線程安全的,所以可以在多線程的環(huán)境中使用。我們對其內部的兩個字典集合都進行了加鎖控制。

(3) Add 方法采用的也是覆蓋原則――如果同 Key 的對象已經(jīng)存在,則用新對象覆蓋舊的對象。

4. 使用時的注意事項

當調用 Remove 方法刪除的是某個分組中的最后一個對象時,在該對象被刪除后,對應的分組將也會被刪除。所以,管理器中不會存在“空”的歷史分組。也就是說, GetGroupsCopy 方法返回的分組標志列表中的每個分組標志在管理器中對應的分組都包含至少一個被分組對象。

5. 擴展

分組對象管理器 IGroupingObjectManager 暫時沒有任何擴展。

注:ESBasic源碼可到 http://esbasic.codeplex.com/ 下載。
ESBasic討論:37677395
ESBasic開源前言

ESBasic 可復用的.NET類庫(13) -- 分組對象管理器 IGroupingObjectManager


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 大庆市| 潢川县| 钟山县| 井冈山市| 灵川县| 昌吉市| 肥西县| 铁力市| 陵水| 浠水县| 葫芦岛市| 永仁县| 高安市| 呼和浩特市| 信宜市| 盐山县| 郁南县| 新源县| 古交市| 孟津县| 安西县| 西乌| 岱山县| 林周县| 吴堡县| 呼图壁县| 喀喇沁旗| 惠东县| 乐平市| 郧西县| 清丰县| 信阳市| 灵璧县| 新河县| 德令哈市| 新竹市| 高青县| 佳木斯市| 滦平县| 湖北省| 鄢陵县|