设计模式中迷宫的实现,用于学习创建型模式

    设计模式一书相信不少人看过。其中创建型模式一节通过一个创建迷宫的例子阐述了工厂模式、抽象工厂模式等创建型模式。对于初学者而言,书中讲解并未实现具体代码,对于几种设计模式的优势不能深刻的体会。出于学习的目的我实现了这个迷宫,并且尽量保持原书中的类结构,用于体会创建型模式的优点。代码并不难,详见注释。本源码中仅实现了抽象工厂模式,其他模式详见设计模式一书。注意启动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>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值