首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于 抽象工厂 模式中, 同一系列产品间互相引用的有关问题

2012-02-24 
关于 抽象工厂 模式中, 同一系列产品间互相引用的问题解释一下. 因为通过抽象工厂创建, 在ConcreteMaze里

关于 抽象工厂 模式中, 同一系列产品间互相引用的问题
解释一下. 因为通过抽象工厂创建, 在ConcreteMaze里面只存有Room的指针, 而在ConcreteMaze::CreateMonsterInMaze()里面, 我需要调用ConcreteRoom::IsPointInside(). 同时, 因为客户代码不需要知道IsPointInside()这个方法所以我不想把这方法放到Room基类里面.

我的问题就是, 怎样修改代码能在ConcreteMaze里调用ConcreteRoom::IsPointInside的时候不用写dynamic_cast?

即"在抽象工厂内, 同一系列的产品间互相引用, 如何在不把接口提到基类的情况下去掉dynamic_cast"

C/C++ code
struct Maze
{
  virtual void AddRoom(Room*) = 0;
  virtual void SthMustDo() = 0;
};

struct Room
{};

struct ConcreteMaze : public Maze
{
  virtual void AddRoom(Room* r){mRoomVector.push_back(r);};
   
  void CreateMonsterInMaze()
  {
  //balabalabala~~
  POINT monsterPosition;
  ConcreteRoom* room = dynamic_cast<ConcreteRoom*>(*mRoomVector.begin());
  room->IsPointInside(monsterPosition);
  //balabalabala~~
  }

  virtual void SthMustDo(){CreateMonsterInMaze();};

  vector<Room*> mRoomVector;
};

struct ConcreteRoom : public Room
{
  bool IsPointInside(POINT){}
};

struct MazeFactory
{
  virtual Maze* CreateMaze() = 0;
  virtual Room* CreateRoom() = 0;
};

struct ConcreteMazeFactory
{
  virtual Maze* CreateMaze(){return new ConcreteMaze};
  virtual Room* CreateRoom(){return new ConcreteRoom};
};

void ConstructMaze(const MazeFactory* f)
{
  Maze* m = f->CreateMaze();
  Room* r = f->CreateRoom();
  m->AddRoom(r);
  m->SthMustDo();
}

void main()
{
  ConcreteMazeFactory factory;
  ConstructMaze(&factory);
}



[解决办法]
可以把IsPointInside()提升到类Room里,这样就用不着向下转换。
//ConcreteRoom* room = dynamic_cast<ConcreteRoom*>(*mRoomVector.begin());
//room->IsPointInside(monsterPosition);

俺感觉这SthMustDo()像是用来处理迷宫表现的,builder好像比较合适些。(就设计意图而言)
monster类似builder中例子的door。(gof书中的例子)

热点排行