设计模式一书相信不少人看过。其中创建型模式一节通过一个创建迷宫的例子阐述了工厂模式、抽象工厂模式等创建型模式。对于初学者而言,书中讲解并未实现具体代码,对于几种设计模式的优势不能深刻的体会。出于学习的目的我实现了这个迷宫,并且尽量保持原书中的类结构,用于体会创建型模式的优点。代码并不难,详见注释。本源码中仅实现了抽象工厂模式,其他模式详见设计模式一书。注意启动RTTI,下图为运行效果。
以下源码为不使用创建型模式的实现。
#include <iostream>
#include <Windows.h>
#include <string.h>
enum Direction{North,South,West,East};
class Coor//在数组中的坐标
{
public:
Coor(int v=0,int h=0):vertical(v),horizontal(h){}
int vertical;
int horizontal;
};
class MapSite
{
public:
virtual void Enter()=0;
};
class Wall:public MapSite
{
public:
virtual void Enter()
{
std::cout<<"this is a Wall!"<<std::endl;
}
};
class Room:public MapSite
{
public:
Room(Coor r){
m_linenumber=r.horizontal;
m_rownumber=r.vertical;
}
MapSite* GetSide(Direction d) const
{
return m_sides[d];
}
void SetSide(Direction d,MapSite* m)
{
m_sides[d]=m;
}
virtual void Enter()
{
std::cout<<"You entered the room "<<m_rownumber<<","<<m_linenumber<<std::endl;
}
private:
MapSite* m_sides[4];
int m_linenumber;
int m_rownumber;
};
class Door:public MapSite
{
public:
Door(Room* r1= 0,Room* r2= 0,bool b=true)
{
m_room1=r1;
m_room2=r2;
m_isOpen=b;
}
virtual void Enter()
{
if(m_isOpen==true)
std::cout<<"you went through the door."<<std::endl;
else
std::cout<<"the door is closed."<<std::endl;
}
Room* OtherSideFrom(Room* r)
{
if(r==m_room1)
return m_room2;
else
return m_room1;
}
void setIsOpen(bool b)
{
m_isOpen=b;
}
bool getIsOpen()
{
return m_isOpen;
}
private:
Room* m_room1;
Room* m_room2;
bool m_isOpen;
};
class Person//迷宫中的人
{
public:
Coor getPlace(){return m_place;}
void setPlace(Coor place){
m_place=place;
}
private:
Coor m_place;
};
class Maze//迷宫
{
public:
Maze(int height=3,int width=3,Coor Place=Coor(0,0))
{
m_height=height;
m_width=width;
m_rooms=new Room**[height];
memset(m_rooms,0,height*sizeof(Room**));
m_p.setPlace(Place);
}
void addRoom(Room* r,int h,int w)
{
if(w<0||w>