Mediator Pattern --中介者模式原理及实现(C++)
主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍中介者模式的实现。

中介者模式:What it is:Define an object that encapsulates how a set of objects interact. Promotes loose coupling by keeping objects from referring to each other explicitly and it lets you vary their interactions independently.
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
优点:Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator; 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
缺点:由于ConcreteMediator控制了集中化。于是就把交互的复杂性变为了中介者的复杂性,使得中介者比任何一个ConcreteColleague都复杂。
本文就以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式,下面以租房为例,给出中介者模式的UML图。

C++代码实现Mediator模式:
#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){}
virtual void SendMessage(string &message){}
virtual void GetMessage(string &message){}
protected:
Mediator *p_mediator; //中介
}; /*定义抽象中介类*/
class Mediator
{
public:
virtual void Send(string &message, Person *person){}
virtual void SetRenter(Person *renter){}
virtual void SetLandlord(Person *landlord){} }; /*定义租客类*/
class Renter:public Person
{
public:
void SetMediator(Mediator *mediator){p_mediator = mediator;}
void SendMessage(string &message){ p_mediator->Send(message,this);}
void GetMessage(string &message){cout<<"租房者收到房东发来的消息:"<<message;}
}; /*定义房东类*/
class Landlord:public Person
{
public:
void SetMediator(Mediator *mediator){p_mediator = mediator;}
void SendMessage(string &message){ p_mediator->Send(message,this);}
void GetMessage(string &message){cout<<"房东收到租客发来的消息:"<<message;}
}; /*定义具体中介类*/
class HouseMediator:public Mediator
{
public:
HouseMediator():p_renter(NULL),p_landlord(NULL){}
void SetRenter(Person *renter){p_renter = renter;}
void SetLandlord(Person *landlord){p_landlord = landlord;}
void Send(string &message, Person *person)
{//接收消息的对象为该对象的对应对象
if(person == p_renter)
p_landlord->GetMessage(message);
else
p_renter->GetMessage(message);
}
private:
Person *p_renter;
Person *p_landlord;
};
int main(int argc, char *argv[])
{
Mediator *mediator = new HouseMediator();
Person *person1 = new Renter();
Person *person2 = new Landlord();
mediator->SetRenter(person1);
mediator->SetLandlord(person2);
person1->SetMediator(mediator);
person2->SetMediator(mediator);
person1->SendMessage(string("我想在深圳北站附近租套房子,一室一厅\n"));
person2->SendMessage(string("我出租一条房子,一室一厅,深圳北站附近\n"));
SAFE_DELETE(person1);
SAFE_DELETE(person2)
SAFE_DELETE(mediator);
return ;
}
Mediator Pattern --中介者模式原理及实现(C++)的更多相关文章
- javascript 中mediator pattern(中介者模式)一个实例demo
<!doctype html> <html lang="en"> <head> <title>JavaScript Patterns ...
- Mediator Design Pattern 中介者模式
就是设计一个Mediator类,能够处理其它类的关系. Mediator类: 1 拥有其它全部类的实例对象 2 设置一个接口供其它类使用,其它类也拥有一个Mediator类成员,仅仅需调用这个Medi ...
- 调停者模式Mediator(中介者模式)详解
原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- 中介者模式(Mediator)
中介者模式(Mediator) 中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只 ...
- 24种设计模式--中介者模式【Mediator Pattern】
各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...
- 深入浅出设计模式——中介者模式(Mediator Pattern)
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 第17章 中介者模式(Mediator Pattern)
原文 第17章 中介者模式(Mediator Pattern) 中介者模式 概述: 在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...
随机推荐
- 【转】JAVA CAS原理深度分析
java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包.可见CAS的重要性. CAS CAS:Compare and Swap, 翻译成比较并交换. java.uti ...
- cocos2d-x之value
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...
- 烂泥:为KVM虚拟机添加网卡
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前几篇文章介绍了有关KVM安装虚拟机以及如何给虚拟机添加硬盘,今天我们再来介绍下有关如何给KVM虚拟机添加网卡. 给KVM虚拟机添加网卡,可以分为两种形 ...
- python 练习购物车小程序
# -*- coding:utf-8 -*- shp = [ ['iphone',5000], ['offee',35], ['shoes',800] ] pric_list = [] e = int ...
- Centos开机自启动redis
修改redis.conf,打开后台运行选项: # By default Redis does not run as a daemon. Use 'yes' if you need it. # Note ...
- [转]highcharts图表入门之:如何让highcharts图表自适应浏览器窗体的大小或者页面大小
本文转自: http://jsfiddle.net/vCZ8V/1/ http://www.stepday.com/topic/?740 http://blog.csdn.net/yueritian/ ...
- mvc area区域和异步表单,bootstrap简单实例
码农最怕眼高手低 今天来练习mvc Area技术和bootstrap以及异步表单的C#代码实现. 1.area区域架构对于建立复杂业务逻辑很有帮助,由 AreaRegistration.Regist ...
- 【Ext.Net学习笔记】02:Ext.Net用法概览、Ext.Net MessageBus用法、Ext.Net布局
Ext.Net用法概览 Ext.Net还是很强大,如果运用熟练可以极大的提高编程效率.如果你也要学习Ext.Net,原文博主推荐书籍:<Ext.Net Web 应用程序开发教程>,是英文的 ...
- 用Navicat更新数据库表中的某一字段
最近需要在A表中根据B表的某一值来进行排序输出,无奈SQL技术不够,不知道怎么连接才能达到目标,于是想到在A表中添加B表的目标值字段,然后通过更新A表从而使A表有目标字段,进而进行排名....够不够纠 ...
- UVA 11573 Ocean Currents --BFS+优先队列
采用优先队列做BFS搜索,d[][]数组记录当前点到源点的距离,每次出队时选此时eng最小的出队,能保证最先到达的是eng最小的.而且后来用普通队列试了一下,超时..所以,能用优先队列的,就要用优先队 ...