天天看點

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

1.緣起:

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

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

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

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

2.适用場合:

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

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

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

(3)   經常需要根據分組标志來查詢符合該标志的對象清單。

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

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

3.設計思想與實作

IGroupingObjectManager的接口定義如下:

     public   interface   IGroupingObjectManager < TGroupKey, TObjectKey, TObject >   where  TObject :  IGroupingObject < TGroupKey ,TObjectKey >

    {

         ///   <summary>

         ///  Add 如果已經存在同ID的對象,則用新對象替換舊對象。

         ///   </summary>         

         void  Add(TObject obj);

         void  Remove(TObjectKey objectID);

         ///   <summary>

         ///  Clear 清除所有對象與分組。

         ///   </summary>

         void  Clear();

        TObject Get(TObjectKey objectID);

         int  TotalObjectCount {  get ;}

         ///   <summary>

         ///  GetCountOfGroup 擷取某個分組中的對象的個數。

         ///   </summary>         

         int  GetCountOfGroup(TGroupKey groupID);

         ///   <summary>

         ///  GetAllObjectsCopy 擷取管理器中的所有對象清單。

         ///   </summary>         

         IList < TObject >  GetAllObjectsCopy();

         ///   <summary>

         ///  GetGroupsCopy 擷取所有的分組标志清單。

         ///   </summary>        

         IList < TGroupKey >  GetGroupsCopy();

         ///   <summary>

         ///  GetObjectsCopy 擷取某個分組中的所有對象的清單。

         ///   </summary>         

         IList < TObject >  GetObjectsCopy(TGroupKey groupID);        

    }

這個接口包含有三個泛型參數:TGroupKey、 TObjectKey和 TObject。

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

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

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

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

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

    public   interface   IGroupingObject < TGroupKey,TObjectKey >

    {

        TObjectKey ID {  get ; }

        TGroupKey GroupID {  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讨論QQ群:37677395

    ESBasic開源前言