运行在VS2022,x86,Debug下。
31. 中介者模式
- 中介者模式允许对象之间通过一个中介者对象进行交互,而不是直接相互引用。可以减少对象之间的直接耦合,同时集中化管理复杂的交互。
- 应用:如在游戏开发中,可以使用中介者模式来管理游戏对象之间的碰撞检测。这意味着当一个游戏对象需要检测与其他对象的碰撞时,它不需要直接与其他所有游戏对象进行交互,而是通过中介者来进行交互。
- 实现
- 同事接口,定义中介者对象,用来调用中介者的接口。
- 具体同事类。
- 中介者接口,定义让同事类操作的接口。
- 具体中介者,定义所有同事类对象,负责同事类对象之间的交互。
- 代码如下。
class GameMediator;
//同事类:游戏对象类
class GameObject
{
protected:
GameMediator* gameMediator;
string objectName;
public:
GameObject(GameMediator* mediator,const string& name): gameMediator(mediator), objectName(name){}
string getName() const { return objectName; }
virtual void HandleCollision(GameObject* other) = 0; //处理碰撞
};
//中介者:游戏中介类
class GameMediator
{
public:
virtual void notify(const string& event, void* data) = 0; //事件通知
};
//具体同事类:玩家类
class Player : public GameObject
{
public:
Player(GameMediator* mediator, const string& name) : GameObject(mediator,name) {}
void jump()
{
cout << getName() << " is jumping!" << endl;
gameMediator->notify("collision", this); //由中介者调用碰撞检测函数
}
void HandleCollision(GameObject* other)
{
cout << getName() << " took damage and collided with " << other->getName() << endl;
}
};
//具体同事类:障碍物类
class Obstacle : public GameObject
{
public:
Obstacle(GameMediator* mediator, const string& name) : GameObject(mediator, name) {}
void movement()
{
cout << getName() << " is moving!" << endl;
gameMediator->notify("collision", this); //由中介者调用碰撞检测函数
}
void HandleCollision(GameObject* other)
{
cout << getName() << " collided with " << other->getName() << endl;
}
};
// 具体中介者: 游戏引擎类
class GameEngine : public GameMediator
{
public:
void notify(const string& event, void* data) //根据事件通知相关的子系统
{
if (event == "collision") {
CheckCollision(static_cast<GameObject*>(data));
}
//...
}
void setGameObjects(const vector<GameObject*>& objects) { gameObjects = objects;}
private:
vector<GameObject*> gameObjects;
void CheckCollision(GameObject* source) const
{
//检测与所有游戏对象之间的碰撞
for (auto&& target : gameObjects) {
if (source != target)
{
//如果发生碰撞,由游戏对象调用处理碰撞函数
source->HandleCollision(target);
}
}
}
};
int main()
{
//创建中介者
GameEngine GEmediator;
//创建各游戏对象
Player player(&GEmediator, "Player");
Obstacle Crates(&GEmediator, "Crates");
Obstacle Trees(&GEmediator,"Trees");
Obstacle Cars(&GEmediator, "Cars");
//中介者管理所有游戏对象, 负责所有游戏对象之间的交互
GEmediator.setGameObjects({ &player, &Crates, &Trees, &Cars });
//游戏对象移动
player.jump();
Cars.movement();
return 0;
}