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

类别:.NET开发 点击:0 评论:0 推荐:

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

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

本文地址:http://com.8s8s.com/it/it45399.htm