找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1050|回复: 0

C#设计模式之Composite

[复制链接]

739

主题

468

回帖

4307

牛毛

论坛管理员

狼群

积分
4347
发表于 2008-1-17 21:08:00 | 显示全部楼层 |阅读模式
意图

  将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。

  场景

  我们知道,一个网络游戏通常会有多个游戏大区。每一个游戏大区会有很多游戏服务器(一个游戏大区就是一组游戏服务器)。每一个游戏服务器上会有不同的服务(可以是多个服务)。这是一个明显的部分-整体关系,假设我们现在需要制作一个服务器管理工具,用于显示所有大区、服务器以及服务的信息,并且能开启这些服务(可以是单独开启一个服务,也可以是开启整个服务器上的所有服务,也可以是开启整个大区的所有服务)。

  可以看到,游戏服务器和游戏大区都是一个组合对象,而游戏服务是最底层的节点。客户端在开启一个游戏大区服务的时候,必须和游戏服务器以及游戏服务进行依赖,而在开启游戏服务器上所有服务的时候,必须和游戏服务进行依赖。试想一下,如果一个公司的总裁在管理上不但需要和各总监以及经理进行沟通,还有和底层的员工沟通,那么总裁是不是会太忙碌了一点?由此,我们引入组合模式,使组合对象和单个对象具有一样的表现形式。

  示例代码

  using System;
  using System.Collections.Generic;
  using System.Text;
  namespace CompositeExample
  {
  class Program
  {
  static void Main(string[] args)
  {
  Element server1 = new GameServer(\"GS1\", \"192.168.0.1\");
  server1.Add(new GameService(\"Lobby1\", 1, \"S5Lobby1\"));
  server1.Add(new GameService(\"Gate1\", 2, \"S5Gate1\"));
  server1.Add(new GameService(\"DataExchange1\", 3, \"S5DataExchange1\"));
  server1.Add(new GameService(\"Rank1\", 4, \"S5Rank1\"));
  server1.Add(new GameService(\"Log1\", 5, \"S5Log1\"));
  Element server2 = new GameServer(\"GS2\", \"192.168.0.2\");
  server2.Add(new GameService(\"Lobby2\", 1, \"S5Lobby2\"));
  server2.Add(new GameService(\"Gate2\", 2, \"S5Gate2\"));
  server2.Add(new GameService(\"DataExchange2\", 3, \"S5DataExchange1\"));
  server2.Add(new GameService(\"Rank2\", 4, \"S5Rank2\"));
  server2.Add(new GameService(\"Log2\", 5, \"S5Log2\"));
  Element area = new GameArea(\"电信区\");
  area.Add(server1);
  area.Add(server2);
  area.Display();
  area.Start();
  area.Stop();
  }
  }
  abstract class Element
  {
  protected string name;
  public Element(string name)
  {
  this.name = name;
  }
  public abstract void Add(Element element);
  public abstract void Remove(Element element);
  public abstract void Display();
  public abstract void Start();
  public abstract void Stop();
  }
  class GameService : Element, IComparable
  {
  private int serviceType;
  private string serviceName;
  public GameService(string name, int serviceType, string serviceName)
  : base (name)
  {
  this.serviceName = serviceName;
  this.serviceType = serviceType;
  }
  public override void Add(Element element)


  {
  throw new ApplicationException(\"xxx\");
  }
  public override void Remove(Element element)
  {
  throw new ApplicationException(\"xxx\");
  }
  public override void Display()
  {
  Console.WriteLine(string.Format(\"name:{0},serviceType:{1},serviceName:{2}\", name, serviceType, serviceName));
  }
  public override void Start()
  {
  Console.WriteLine(string.Format(\"{0} started\", name));
  }
  public override void Stop()
  {
  Console.WriteLine(string.Format(\"{0} stopped\", name));
  }
  public int CompareTo(GameService other)
  {
  return other.serviceType.CompareTo(serviceType);
  }
  }
  class GameServer : Element
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-27 05:25 , Processed in 0.118372 second(s), 23 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表