以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  设计模式之C#实现(一)--AbstractFactory(补)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11877)


--  作者:admin
--  发布时间:11/9/2004 2:26:00 AM

--  设计模式之C#实现(一)--AbstractFactory(补)


发信人: wrighten (wrighten), 信区: DotNET
标  题: 设计模式之C#实现(一)--AbstractFactory(补)
发信站: BBS 水木清华站 (Fri Mar  5 11:03:33 2004), 转信

此文章是为了补充下面的文章所写,详细信息可以去下面看
  http://www.csdn.net/Develop/read_article.asp?id=20943
  GOF书中的例子用C#实现的源码:
  using System;
  namespace AbstractFactory_Maze{
   using Maze;
   public interface AbstractFactory{
    MazeClass MakeMaze();
    Wall MakeWall();
    Room MakeRoom(int n);
    Door MakeDoor(Room oneRoom,Room otherRoom);
   }
   public class MazeFactory : AbstractFactory{
    public MazeClass MakeMaze(){
     return new MazeClass();
    }
   public Wall MakeWall(){
    return new Wall();
   }
   public Room MakeRoom(int n){
    return new Room(n);
   }
   public Door MakeDoor(Room oneRoom,Room otherRoom){
    return new Door(oneRoom,otherRoom);
    }
   }
   // this is a client

   public class MazeGame{
    public MazeClass MazeCreate(AbstractFactory factory){
    MazeClass aMaze = factory.MakeMaze();
    Room r1 = factory.MakeRoom(1);
    Room r2 = factory.MakeRoom(2);
    Door aDoor = factory.MakeDoor(r1,r2);
    aMaze.AddRoom(r1);
    aMaze.AddRoom(r2);
    r1.SetSide(Direction.North,factory.MakeWall());
    r1.SetSide(Direction.East,aDoor);
    r1.SetSide(Direction.South,factory.MakeWall());
    r1.SetSide(Direction.West,factory.MakeWall());
    r2.SetSide(Direction.North,factory.MakeWall());
    r2.SetSide(Direction.East,factory.MakeWall());
    r2.SetSide(Direction.South,factory.MakeWall());
    r2.SetSide(Direction.West,aDoor);
    return aMaze;
    }
   }
  }
  namespace Maze{
   using System.Collections;
   public class MapSite{
   public virtual void Enter(){}
   }
   public enum Direction {North,South,East,West}
    public class Room : MapSite{
    public string Print(){
    string result = "";
    for(int i = 0 ;i<=3;i++){
     switch(i){
      case (int)Direction.East:{
      result += "East is:"+this.GetSide(Direction.East)+"\t";
      break;
      }
      case (int)Direction.North:{
      result += "North is:"+this.GetSide(Direction.North)+"\t";
      break;
      }
      case (int)Direction.South:{
      result += "South is:"+this.GetSide(Direction.South)+"\t";
      break;
      }
      case (int)Direction.West:{
      result += "West is:"+this.GetSide(Direction.West)+"\t";
      break;
      }
     }
   }
   return result;
}
   public Room(int n){
   this.m_roomNumber = n;
   }
   public MapSite GetSide(Direction dir){
   return this.m_sides[(int)dir];
   }
   public void SetSide(Direction dir,MapSite mapSite){
   this.m_sides[(int)dir] = mapSite;
   }
   public override void Enter(){}
   private MapSite[] m_sides = new MapSite[4];
   int m_roomNumber;
  }
   public class Wall : MapSite{
    public Wall(){}
    public override void Enter(){}
   }

   public class Door : MapSite{
    public Door(Room oneRoom,Room otherRoom){}
    public override void Enter(){}
    public Room oneRoom{
     get{return this.m_oneRoom;}
     set{this.m_oneRoom = value;}
   }

   private Room m_oneRoom;
   public Room otherRoom{
   get{return this.m_otherRoom;}
   set{this.m_otherRoom = value;}
   }

   private Room m_otherRoom;
   private bool m_isOpen;
   public bool IsOpen{
    get{return this.m_isOpen;}
    set{this.m_isOpen = value;}
   }
  }

   public class MazeClass{
    public MazeClass(){}
    public string Print(){
    string result = "";
    for(int i = 0; i<=this.m_Maze.Count-1;i++){
    result +=this.RoomNumber(i).Print()+"\n";
   }
    return result;
  }

  public void AddRoom(Room room){
   m_Maze.Add(room);
  }
   public Room RoomNumber(int roomNumber){
    return (Room)this.m_Maze[roomNumber];
   }
   private ArrayList m_Maze = new ArrayList();
  }
}
   private void Form1_Load(object sender, System.EventArgs e) {
   AbstractFactory factory = new MazeFactory();
   MazeGame game = new MazeGame();
   MazeClass aMaze = game.MazeCreate(factory);
   this.richTextBox1.AppendText(aMaze.Print());
  }


  以下为输出结果:

  North is:Maze.Wall South is:Maze.Wall East is:Maze.Door West is:Maze.Wall

  North is:Maze.Wall South is:Maze.Wall East is:Maze.Wall West is:Maze.Door

    

--
情人节一个人过。。。。。。
cplusplus forever


※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.113.16.*]
上一篇
返回上一页
回到目录
回到页首
下一篇



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms