中介者模式
现在大部分的年轻人都离不开外卖了,因为方便、快捷等等,让他们爱不释手,那么一个好用的外卖app就是一个好的工具了,而外卖app就可以说一个中介者,将骑手和用户分离开来,不需要用户和骑手直接交流,比如点外卖通过给骑手打电话啥的,那这真就是扯淡的app了,中介者模式就是用一个中介对象来封装一些列需要交互的对象(骑手和用户),使得其对象之间不需要显式的交互(打电话)。但是大部分餐到了,会打电话给顾客是因为,大部分人点了外卖就不看手机,然后以不通知我为由给差评。

Colleague:抽象类,用于表示需要被中介的一类对像,比如骑手和用户都是人、联合国联合的都是国家等等
ConcreteColleague:具体实现类,表示单个对象的具体实现,比如骑手类、用户类等等
Mediator:抽象中介者类,主要实现了储存各个需要中介者对象的接口,简单来说就是set接口,让你可以把每个对象都放到这个里面去,而具体实现就看子类了
ConcreteMediator:具体中介者对象,制定需要被中介的对象类型,并且实现set接口,并且提供转发接口,常需要输入消息和对象
使用场景:
- 系统中的类相互引用逻辑复杂,导致几乎不可能代码重用
- 由于各种设计模式的使用,使得类的数量不少,而该模式可以将多个类的行为封装,减少类的数量
优点:
- 降低复杂度,将一对多个对象的使用减少到了一对一的使用
- 将多个对象互相调用解耦
- 符合迪米特法则
缺点:
- 随着对象的增多,可能导致中介者对象很复杂,各种对象的穿插使用,可能很难维护
实操

注:在编写的时候,发现当由相互调用的类定义和声明都写在同一个文件的时候,需要注意使用class XXX的率先声明方式,这样先声明的可以使用后面的类,但是注意只能出现类对象定义,不可以使用类方法,因此需要较好的去设计类声明的顺序。
思维过程:
- 先实现CPerson,因为简单,那只需要实现接收信息和发信息就行了,因为大部分人点外卖都需要一个app
- 实现子类,重写虚函数就行了
- 实现CApp,先写设置接口,可以让外部设置需要中介的对象,然后设定各种行为函数,比如信息传递、计算等等
- 实现具体的中介类,声明需要中介的对象并设置,然后实现需要的功能函数即可
// MediatorModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
class CApp;
class CPerson
{
protected:
CApp *m_pApp;
public:
virtual void setApp(CApp* app) {}
virtual void sendMessage(string mess) {}
virtual void receiveMessage(string mess) {}
};
class CApp
{
public:
virtual void send(string mes, CPerson* per) {}
virtual void setPersonA(CPerson *per) {}
virtual void setPersonB(CPerson *per) {}
};
class CDeliveryPerson:public CPerson
{
public:
void setApp(CApp *app) { m_pApp = app; }
void sendMessage(string mess) { m_pApp->send(mess, this); }
void receiveMessage(string mess) { cout << "来新单了。" << endl; }
};
class COrderPerson :public CPerson
{
public:
void setApp(CApp* app) { m_pApp = app; }
void sendMessage(string mess) { m_pApp->send(mess, this); }
void receiveMessage(string mess) { cout << "订单已完成。" << endl; }
};
class CDeliveryApp :public CApp
{
private:
CPerson *m_pDeliveryA;
CPerson *m_pOrderPersonB;
public:
CDeliveryApp():m_pDeliveryA(NULL),m_pOrderPersonB(NULL)
{
}
void setPersonA(CPerson *per) { m_pDeliveryA = per; }
void setPersonB(CPerson *per) { m_pOrderPersonB = per; }
void send(string mes, CPerson* per)
{
if (NULL == m_pDeliveryA || NULL == m_pOrderPersonB)
return;
if (per == m_pDeliveryA)
m_pOrderPersonB->receiveMessage(mes);
else
m_pDeliveryA->receiveMessage(mes);
}
};
int main()
{
CApp *meituan = new CDeliveryApp();
CPerson* deliver = new CDeliveryPerson();
CPerson* order = new COrderPerson();
meituan->setPersonA(deliver);
meituan->setPersonB(order);
deliver->setApp(meituan);
order->setApp(meituan);
cout << "用户下单牛肉面。" << endl;
order->sendMessage("我点了牛肉面。");
cout << "外卖到了。" << endl;
deliver->sendMessage("外卖到了。");
}
本文介绍了中介者模式,通过外卖app的例子解释了其如何将骑手和用户之间的交互进行封装,降低直接交流的需求。文章讨论了Colleague、ConcreteColleague、Mediator和ConcreteMediator的角色,以及模式的适用场景、优点。虽然中介者模式可以降低复杂度和解耦,但随着对象增加,中介者对象可能会变得复杂,维护难度增大。实际操作中需要注意类声明的顺序以避免依赖问题。
1463

被折叠的 条评论
为什么被折叠?



