中介者模式

it2024-11-05  6

中介者模式

现在大部分的年轻人都离不开外卖了,因为方便、快捷等等,让他们爱不释手,那么一个好用的外卖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("外卖到了。"); }

 

最新回复(0)