前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
前言
中介者模式主要用于多个对象之间的交互,所谓交互就是会互相调用对方的接口方法。中介者模式体现了最少知识原则,通过第三方来进行交互,避免了互为数据成员。
实现举例
- 场景描述
假设一个在线购物场景:有买家、卖家、购物网站三个角色,其中购物网站即为中介者,买家和卖家互不认识,但是都知道同一个购物网站。
- 抽象同事类
卖家和买家可以继承自同一个基类。
#include <string>
#include <iostream>
using namespace std;
class Mediator;
class Businessman
{
public:
Businessman(string m_name,Mediator * m_mediator ):name(m_name),mediator(m_mediator){}
virtual void senMessage(const string &message)= 0;
virtual void getMessage(const string &message) = 0;
virtual ~Businessman(){}
protected:
string name;
Mediator * mediator;
};
- 同事派生类
①.买家类
#include "businessman.h"
#include "mediator.h"
class Buyer:public Businessman
{
public:
using Businessman::Businessman;
void getMessage(const string &message) override
{
cout << name <<"收到"<<message<<endl;
}
void senMessage(const string &message) override
{
mediator->senMessage("来自"+name+"的消息:"+message,this);
}
};
②.卖家类
#include "businessman.h"
#include "mediator.h"
class Seller : public Businessman
{
public:
using Businessman::Businessman;
void getMessage(const string &message) override
{
cout << name <<"收到"<<message<<endl;
}
void senMessage(const string &message) override
{
mediator->senMessage("来自"+name+"的消息:"+message,this);
}
};
- 抽象中介者
#include "businessman.h"
class Mediator
{
public:
Mediator(){}
virtual void senMessage(const string &message,Businessman * man) = 0;
virtual ~Mediator(){}
};
- 具体中介者
#include "mediator.h"
#include "buyer.h"
#include "seller.h"
class JX : public Mediator
{
public:
using Mediator::Mediator;
JX(Buyer * m_buyer,Seller * m_seller):buyer(m_buyer),seller(m_seller){}
void iniMediator(Buyer * m_buyer,Seller * m_seller)
{
buyer = m_buyer;
seller = m_seller;
}
void senMessage(const string &message, Businessman *man) override
{
if( man == buyer )
{
seller->getMessage(message);
}
else if( man == seller)
{
buyer->getMessage(message);
}
}
private:
Buyer * buyer;
Seller * seller;
};
- 客户端调用
#include "buyer.h"
#include "seller.h"
#include "jx.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建中介者:京西
JX * jx = new JX();
//创建卖家和买家对象
Seller * seller = new Seller("王老板",jx);
Buyer * buyer = new Buyer("张三",jx);
jx->iniMediator(buyer,seller);
//买家发布消息
buyer->senMessage("我要买衣服");
//卖家回复消息
seller->senMessage("我家有卖");
return a.exec();
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200910190757202.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpemhpY2hhbzQxMA==,size_16,color_FFFFFF,t_70#pic_center)