.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
设计模式之C#实现(一)--AbstractFactory(补)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

此文章是为了补充下面的文章所写,详细信息可以去下面看

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




相关文章

相关软件