|
shenyoujia
- 管理员
- 14848
- 1423
-
2009-11-07
|
shenyoujia
2010-01-07 17:03
|只看楼主
1#
t
T
- class Program
- {
- static void Main(string[] args)
- {
- BizHandler biz = BizHandler.Instance;
- biz.Register("register", "2", new Entity()
- {
- Ip = "1.2.3.4",
- port = "80",
- Type = "register",
- ServerName = "cj"
- });
- biz.Register("getList", "5", new Entity()
- {
- Ip = "1.2.3.4",
- port = "80",
- Type = "register",
- ServerName = "cj"
- });
- biz.PrintAllRooms();
- }
- }
- class Entity
- {
- public string Type { get; set; }
- public string Ip { get; set; }
- public string port { get; set; }
- public string ServerName { get; set; }
- public override string ToString()
- {
- return this.Ip + "-" + this.ServerName;
- }
- }
- /// <summary>
- /// 简单工厂类,返回一个Container
- /// </summary>
- class ContainerFactory
- {
- public static Container<string, string, Entity> Instance
- {
- get
- {
- return container;
- }
- }
- //构造器私有化
- private ContainerFactory() { }
- private static Container<string, string, Entity> container = new Container<string, string, Entity>();
- }
- //自定义一个泛型类,作为 3个元素 存储的容器——相当于三层架构中的数据存储
- //开写这个底层容器之前还没有感觉,现在发现写下来以后,这个容器还是有不少作用的。
- //比较像的是 DataBase中的 分组 功能。如相同的房间room中,有不同的id号的人,拿到他们的Entity。
- //T1对应于String的room,T2多半就是UniqueIdentifier的唯一标识,T3可以是任何object
- class Container<T1, T2, T3>
- {
- private Dictionary<T1, Dictionary<T2, T3>> dictionary = null;
- public Container()
- {
- dictionary = new Dictionary<T1, Dictionary<T2, T3>>();
- }
- //存入相对简单,因为是 黑匣 操作。用户无需关心底层是如何实现存储的。
- /// <summary>
- /// 类似于数据库中的‘增’
- /// </summary>
- /// <param name="t1"></param>
- /// <param name="t2"></param>
- /// <param name="t3"></param>
- public void PutThree(T1 t1, T2 t2, T3 t3)
- {
- Dictionary<T2, T3> subMap = null;
- if (subMap == null)
- {
- subMap = new Dictionary<T2, T3>();
- dictionary.Add(t1, subMap);
- }
- subMap.Add(t2, t3);
- }
- //查就要麻烦的多
- /// <summary>
- /// 拿到最大的那个集合中的Key的List
- /// 亦即返回所有的Rooms组成一个集合(看看一共有多少Rooms)
- /// </summary>
- /// <returns></returns>
- public ICollection<T1> GetKeys()
- {
- return dictionary.Keys;
- }
- /// <summary>
- /// 根据指定的T1,获取 子Map(SubMap)
- /// 亦即根据Room,获得其中的 唯一标识+实体 List
- /// </summary>
- /// <param name="t1"></param>
- /// <returns></returns>
- public Dictionary<T2, T3> GetSubMap(T1 t1)
- {
- return dictionary[t1];
- }
- /// <summary>
- /// 得到小集合的键的List
- /// 亦即给定一个 子集合,就得到一个 唯一标识 组成的List
- /// </summary>
- /// <param name="subMap"></param>
- /// <returns></returns>
- public ICollection<T2> GetSubKeys(Dictionary<T2, T3> subMap)
- {
- return subMap.Keys;
- }
- /// <summary>
- /// 根据给定的一个 大集合 的Key,得到小集合的Key组成的集合:重载的方法
- /// 亦即给定 Room ,就可以得到该room中所有的 唯一标识 List
- /// </summary>
- /// <param name="t1"></param>
- /// <returns></returns>
- public ICollection<T2> GetSubKeys(T1 t1)
- {
- return dictionary[t1].Keys;
- }
- /// <summary>
- /// 根据给定的 子集合 和 子集合的键 得到对应的 值
- /// 亦即给定一个 唯一标识+实体 List 和 标识,可以得到对应的实体
- /// </summary>
- /// <param name="subMap"></param>
- /// <param name="t2"></param>
- /// <returns></returns>
- public T3 GetSubValues(Dictionary<T2, T3> subMap, T2 t2)
- {
- return subMap[t2];
- }
- /// <summary>
- /// 给定 大集合的主键和小集合的主键,就能得到对应的值,很像 复合主键:重载的方法
- /// 亦即给定 room 和 id ,就能得到对应的 object
- /// </summary>
- /// <param name="t1"></param>
- /// <param name="t2"></param>
- /// <returns></returns>
- public T3 GetSubValues(T1 t1, T2 t2)
- {
- //var subMap = this.GetSubMap(t1);
- return this.GetSubValues(this.GetSubMap(t1), t2);
- }
-
- }
- //增加一层中间层,将DAL与UI隔离开,也便于测试。且实现单例模式
- class BizHandler
- {
- private static BizHandler _instance = _instance = new BizHandler();
- internal static BizHandler Instance
- {
- get { return BizHandler._instance; }
- }
- private BizHandler()
- {
- }
- //持有一个下层的引用
- Container<string, string, Entity> container = ContainerFactory.Instance;
- /// <summary>
- /// 类似于数据库中的‘增’
- /// </summary>
- /// <param name="t1"></param>
- /// <param name="t2"></param>
- /// <param name="t3"></param>
- public void Register(string room, string id, Entity server)
- {
- container.PutThree(room, id, server);
- }
- public void PrintAllRooms()
- {
- if (container.GetKeys().Count == 0)
- {
- Console.WriteLine("还没有放入任何元素");
- }
- else
- {
- foreach (var keys in container.GetKeys())
- {
- Console.WriteLine(keys);
- Console.WriteLine("------房间内的东西-------");
- foreach (var subkey in container.GetSubKeys(keys))
- {
- Console.Write(subkey + ":::::::::::");
- Console.WriteLine(container.GetSubValues(keys, subkey));
- }
- Console.WriteLine();
- Console.WriteLine();
- }
- }
- }
-
- }
复制代码
-
1
评分次数
-
本主题由 管理员 张波老师 于 2010-1-7 18:09:41 执行 设置精华/取消 操作
|