一 应用场景
以房屋中介为例,租房者向中介询问租房信息,出租者向中介提供房子信息。
二 定义
中介者模式 Mediator Pattern:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
Mediator 抽象中介者:定义一个接口,用于各个对象之间的通信。
ConcreteMediator 具体中介者:抽象中介者的子类,通过协调各个同事对象来实现协作行为,维持各个对各个对象的引用。
Colleage 抽象同事类:定义各个对象的公有方法。同时维持一个对抽象中介类的引用,其对象可以通过该引用实现与中介通信。
ConcreteMediator 具体同事类:每个同事对象在通信的时候先与中介者通信,通过中介来完成与其他同事的通信
三 C++实现
Mediator.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
class Mediator;
class Person
{
public:
virtual void setMediator(Mediator * _mediator) = 0;
virtual void sendMsg(std::string _msg) = 0;
virtual void getMsg(std::string _msg) = 0;
protected:
Mediator * mediator;
};
class Mediator
{
public:
virtual void sendMsg(std::string _msg, Person * _person) = 0;
virtual void setRenter(Person * _renter) = 0;
virtual void setLandlord(Person * _landlord) = 0;
};
class Renter:public Person
{
public:
void setMediator(Mediator * _mediator){
mediator = _mediator;
}
void sendMsg(std::string _msg){
mediator->sendMsg(_msg, this);
}
void getMsg(std::string _msg){
std::cout << "msg from landlord: " << _msg << std::endl;
}
};
class Landlord:public Person
{
public:
void setMediator(Mediator * _mediator){
mediator = _mediator;
}
void sendMsg(std::string _msg){
mediator->sendMsg(_msg, this);
}
void getMsg(std::string _msg){
std::cout << "msg from renter" << _msg << std::endl;
}
};
class ConcreteMediator:public Mediator
{
public:
ConcreteMediator():p_renter(NULL), p_landlord(NULL){}
void sendMsg(std::string _msg, Person * _person){
if(_person == p_renter){
p_landlord->getMsg(_msg);
} else if(_person==p_landlord){
p_renter->getMsg(_msg);
}
}
void setRenter(Person * _renter){
p_renter = _renter;
}
void setLandlord(Person * _landlord){
p_landlord = _landlord;
}
private:
Person * p_renter;
Person * p_landlord;
};
main.cpp
#include <iostream>
#include <string>
#include <ostream>
#include "Mediator.h"
using namespace std;
int main()
{
Mediator * mediator = new ConcreteMediator();
Person * renter = new Renter();
Person * landlord = new Landlord();
mediator->setRenter(renter);
mediator->setLandlord(landlord);
renter->setMediator(mediator);
landlord->setMediator(mediator);
renter->sendMsg(std::string("I want to rent a hourse\n"));
system("pause");
return 0;
}
运行结果
四 总结
优点:
1 简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
2 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合
缺点
1 在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。