一、说明
中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之前的交互。
如果对象与对象之前存在大量的关联关系,若一个对象改变,常常需要跟踪与之关联的对象,并做出相应的处理,这样势必会造成系统变得复杂,遇到这种情形可以考虑使用中介者模式。当多个对象存在关联关系时,为它们设计一个中介对象,当一个对象改变时,只需要通知它的中介对象,再由它的中介对象通知每个与它相关的对象。
二、代码
#ifndef ZHONGJIE_H
#define ZHONGJIE_H
#include <QWidget>
#include <QDebug>
class middle;
class houseBuyer;
class houseSeller;
class person
{
public:
person(middle *Middle){
m_pMiddle = Middle;
}
virtual ~person(){}
virtual void sendMsg(const QString &msg)=0;
virtual void getMsg(const QString &msg)=0;
protected:
middle *m_pMiddle;
};
class middle
{
public:
virtual ~middle(){}
virtual void setBuyer(person *buyer)=0;
virtual void setSeller(person *seller)=0;
virtual void sendMsg(person *send,const QString &msg)=0;
};
class middleInstance:public middle
{
public:
middleInstance();
~middleInstance() override;
void setBuyer(person *buyer) override;
void setSeller(person *seller) override;
void sendMsg(person *send,const QString &msg) override;
private:
houseBuyer *m_pBuyer;
houseSeller *m_pSeller;
};
class houseBuyer: public person
{
public:
houseBuyer(middleInstance *middle = nullptr);
~houseBuyer() override;
void sendMsg(const QString &msg) override;
void getMsg(const QString &msg) override;
};
class houseSeller: public person
{
public:
houseSeller(middleInstance *middle = nullptr);
~houseSeller() override;
void sendMsg(const QString &msg) override;
void getMsg(const QString &msg) override;
};
class demo
{
public:
demo();
};
#endif // ZHONGJIE_H
#include "zhongjie.h"
houseBuyer::houseBuyer(middleInstance *middle):
person(middle)
{
}
houseBuyer::~houseBuyer()
{
}
void houseBuyer::sendMsg(const QString &msg)
{
m_pMiddle->sendMsg(this,msg);
}
void houseBuyer::getMsg(const QString &msg)
{
qDebug()<<"houseBuyer::getMsg"<<msg;
}
houseSeller::houseSeller(middleInstance *middle):
person(middle)
{
}
houseSeller::~houseSeller()
{
}
void houseSeller::sendMsg(const QString &msg)
{
m_pMiddle->sendMsg(this,msg);
}
void houseSeller::getMsg(const QString &msg)
{
qDebug()<<"houseSeller::getMsg"<<msg;
}
middleInstance::middleInstance()
{
}
middleInstance::~middleInstance()
{
}
void middleInstance::setBuyer(person *buyer)
{
m_pBuyer = dynamic_cast<houseBuyer*>(buyer);
}
void middleInstance::setSeller(person *seller)
{
m_pSeller = dynamic_cast<houseSeller*>(seller);
}
void middleInstance::sendMsg(person *send, const QString &msg)
{
if(send == m_pBuyer)
m_pSeller->getMsg(msg);
else if(send == m_pSeller)
m_pBuyer->getMsg(msg);
}
demo::demo()
{
middleInstance *middle = new middleInstance;
houseBuyer *buyer = new houseBuyer(middle);
houseSeller *seller = new houseSeller(middle);
middle->setBuyer(buyer);
middle->setSeller(seller);
buyer->sendMsg("buy house 10 dollor");
seller->sendMsg("get out");
delete seller;
delete buyer;
delete middle;
}