主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍中介者模式的实现。

中介者模式: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++)的更多相关文章

  1. javascript 中mediator pattern(中介者模式)一个实例demo

    <!doctype html> <html lang="en"> <head> <title>JavaScript Patterns ...

  2. Mediator Design Pattern 中介者模式

    就是设计一个Mediator类,能够处理其它类的关系. Mediator类: 1 拥有其它全部类的实例对象 2 设置一个接口供其它类使用,其它类也拥有一个Mediator类成员,仅仅需调用这个Medi ...

  3. 调停者模式Mediator(中介者模式)详解

    原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  4. 中介者模式(Mediator)

    中介者模式(Mediator) 中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只 ...

  5. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

  6. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  7. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  8. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  9. 第17章 中介者模式(Mediator Pattern)

    原文 第17章 中介者模式(Mediator Pattern) 中介者模式  概述:   在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...

随机推荐

  1. 问题解决——multimap中统计key的种类

    ================声明================= 本文原创,转载请注明出处和作者,并保持文章的完整性. 本文链接:http://www.cnblogs.com/wlsandwho ...

  2. 从零开始学习Mysql的学习记录

    2015/06/18 16:23更新,由于QQ邮件的图片链接失效了,请在云笔记链接查看 http://note.youdao.com/share/?id=f0b2ed30a3fc8e57c381e3d ...

  3. Linux date命令的用法

    在linux shell编程中,经常用到日期的加减运算以前都是自己通过expr函数计算,很麻烦.其实date命令本身提供了日期的加减运算非常方便. 例如:得到昨天的时间date  --date=&qu ...

  4. 《JavaScript修炼之道》读书笔记

    1.参考书目 入门:<JavaScript DOM编程艺术>第二版 进阶:<JavaScript高级程序设计>第二版.<JavaScript编程精粹> <Ja ...

  5. DataGridView合并单元格

    昨天一个同事问我DataGridView单元格合并的问题,一开始按照我的设想是算出两个单元格的Rectangle,然后直接使用e.Graphics.FillRectangle(backColorBru ...

  6. Gnome创建桌面快捷方式

    Ctrl+Alt+T打开终端 输入gnome-desktop-item-edit 桌面/ --create-new (注: 桌面/ 要改为你桌面文件夹所在路径) 配置快捷方式属性,在“命令(A)”这行 ...

  7. sublime Text 2 安装Sublime Package Control

    Sublime Text 2 安装 Sublime Package Control,通过 Sublime Package Control,安装.升级和卸载 Package. 安装 Package Co ...

  8. sizeof 和 strlen 的区别

    sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度.那么他么到底有什么区别 1.sizeof    不是函数,而是一个操作符.字节数的计算在程序编译时进行,而不是在 ...

  9. [3D跑酷] GUIManager UI管理

    UI元素更新及界面跳转 继上篇日志<Unity开发之 GUIClickEventReceiver>,再谈一下我们如何管理游戏中的UI元素更新及界面跳转 UI绑定 图一:Inspector面 ...

  10. js知识体系的梳理一

    今天简单的总结了js的一些东西,梳理下整个体系,每一次的总结都会有不同的收获:js总结一一.[获取元素]: 1.通过ID: var oBtn=document.getElementById('btn1 ...