基于创建型模式的“迷宫”构造

本文结合GOF的创建型模式,包括抽象工厂、工厂方法、生成器、原型和单件,构建了一个‘迷宫’构造的示例。通过这种方式,实现了迷宫构造的封装和可扩展性。在实现过程中,还应用了策略模式来绘制迷宫。文章展示了各模式之间的关系,并提供了C++实现代码,涵盖了Room、Wall、Door等类的定义以及Maze类的构建。
摘要由CSDN通过智能技术生成

本文在GOF《设计模式》一书“创建型模式”一章的例子和模式的基础上,将各个创建型模式有机的结合在一起。实现了“迷宫”构造过程的封装,增强了构造不同迷宫的可扩展性。

 

创建型模式:

抽象工厂

工厂方法

生成器

原型

单件

 

其中,抽象工厂是由工厂方法组成的,是一组相互关联的工厂方法的集合。

 

“迷宫”构造类图:

 

 

 

 

 

从类图中可以看出各个模式直接的关系,同时为了显示构造好的迷宫图案,还使用了“策略模式”用于画出迷宫(图中的MazeDrawer类层次)。

 

以下是各个模块的C++实现:

  1. #ifndef _PART_H_
  2. #define _PART_H_
  3. //Part.h
  4. enum Direction
  5. {   
  6.     East,
  7.     South,
  8.     West,
  9.     North   
  10. };
  11. class MapSite
  12. {
  13. public:
  14.     virtual void Enter() = 0;
  15.     virtual char* GetInfo() = 0;
  16. };
  17. class Room:public MapSite
  18. {
  19. public:
  20.     Room(int roomNo)
  21.     {
  22.         _roomNo = roomNo;
  23.         for(int i=0; i<4; ++i)
  24.             _sides[i] = 0;
  25.     }
  26.     
  27.     MapSite* GetSide(Direction d) const
  28.     {
  29.         return _sides[d];
  30.     }
  31.     void SetSide(Direction d, MapSite* ms)
  32.     {
  33.         if(_sides[d] != 0)
  34.             delete _sides[d];
  35.         _sides[d] = ms;
  36.     }
  37.     virtual void Enter()
  38.     {
  39.     
  40.     }
  41.     virtual char* GetInfo()
  42.     {
  43.         return "Room";
  44.     }
  45.     int RoomNo() const
  46.     {
  47.         return _roomNo;
  48.     }
  49. private:
  50.     MapSite* _sides[4];
  51.     int _roomNo;
  52. };
  53. class Wall:public MapSite
  54. {
  55. public:
  56.     Wall()
  57.     {
  58.     
  59.     }
  60.     virtual void Enter()
  61.     {
  62.     
  63.     }
  64.     virtual char* GetInfo()
  65.     {
  66.         return "Wall";
  67.     }
  68. };
  69. class Door:public MapSite
  70. {
  71. public:
  72.     Door(Room* r1 = 0, Room* r2 = 0)
  73.     {
  74.         _room1 = r1;
  75.         _room2 = r2;
  76.         _isOpen = false;
  77.     }
  78.     
  79.     Room* OtherSideFrom(Room* r)
  80.     {
  81.         if(r == _room1)
  82.             return _room2;
  83.         else if(r == _room2)
  84.             return _room1;
  85.         return 0;
  86.     }
  87.     virtual void Enter()
  88.     {
  89.     
  90.     }
  91.     virtual char* GetInfo()
  92.     {
  93.         return "Door";
  94.     }
  95. private:
  96.     Room* _room1;
  97.     Room* _room2;
  98.     bool _isOpen;
  99. };
  100. class Spell
  101. {
  102. public:
  103.     Spell()
  104.     {}
  105. };
  106. class EnchantedRoom: public Room
  107. {
  108. public:
  109.     EnchantedRoo
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值