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

比较典型的例子是联合国、QQ群等。比如,如果中国有事需要通知世界各国,可以通过联合国这一个机构,QQ群可以接收并发布每个成员的消息。


/*
* file: Mediator.h
* brief: Created by night at 2016.12.07
*/ #ifndef __MEDIATOR_H__
#define __MEDIATOR_H__ #include <list>
#include <iostream> using namespace std; class Nation;
class Mediator {
public:
virtual void Send(Nation* member, const char* msg) = 0;
}; class UnitedNationsMediator : public Mediator {
public:
UnitedNationsMediator() { } void Register(Nation* member) { members.push_back(member); } void Send(Nation* member, const char* msg); list<Nation*> members;
}; class Nation {
public:
Nation(const char* sname, Mediator* m) : name(sname), mediator(m) { }
void Send(const char* msg) { mediator->Send(this, msg); }
void Notify(const char* sender, const char* msg) { cout << name << "\t<-- " << sender << ":\t" << msg << endl; } const char* name; protected:
Mediator* mediator;
}; class China : public Nation
{
public:
China(const char* sname, Mediator* m): Nation(sname, m) { }
}; class USA : public Nation
{
public:
USA(const char* sname, Mediator* m) : Nation(sname, m) { }
}; class England : public Nation
{
public:
England(const char* sname, Mediator* m) : Nation(sname, m) { }
}; void TestMediator(); #endif

/*
* file: Mediator.cpp
* brief: Created by night at 2016.12.07
*/ #include "Mediator.h" void UnitedNationsMediator::Send(Nation* member, const char* msg) {
for (list<Nation*>::iterator itr = members.begin(); itr != members.end(); itr++) {
(*itr)->Notify(member->name, msg);
}
} void TestMediator()
{
UnitedNationsMediator* mediator = new UnitedNationsMediator();
China* china = new China("China", mediator);
mediator->Register(china); USA* usa = new USA("USA", mediator);
mediator->Register(usa); England* england = new England("England", mediator);
mediator->Register(england); china->Send("This is from China!");
cout << endl; usa->Send("This is from USA!");
cout << endl; // destroy ...
delete mediator;
mediator = NULL;
delete china;
china = NULL;
delete usa;
usa = NULL;
delete england;
england = NULL;
}

输出结果:

China   <-- China:      This is from China!
USA <-- China: This is from China!
England <-- China: This is from China! China <-- USA: This is from USA!
USA <-- USA: This is from USA!
England <-- USA: This is from USA!

引用

  1. 《设计模式:可复用面向对象软件的基础》

设计模式一日一练:中介者模式(Mediator)的更多相关文章

  1. 设计模式之二十一:中介者模式(Mediator)

    中介者模式:定义了一个对象.用来封装一系列对象的交互.中介者模式通过使对象之间不必显式引用减少了对象之间的耦合,而且同意你独立改变它们之间的交互. 中介者模式就是将对象之间的交互封装在了一个独立的对象 ...

  2. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  3. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

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

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

  5. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

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

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

  7. 中介者模式(Mediator Pattern)

    用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...

  8. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  9. C#设计模式之十八中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

  10. 设计模式的征途—22.中介者(Mediator)模式

    我们都用过QQ,它有两种聊天方式:一是私聊,二是群聊.使用QQ群,一个用户就可以向多个用户发送相同的信息和文件,从而无需一一发送,节省大量时间.通过引入群的机制,极大地减少系统中用户之间的两两通信,用 ...

随机推荐

  1. 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

    在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)

  2. 【面试题】由HashMap引发的一系列追问

    HashMap和HashTable的区别 同:HashMap和Hashtable都实现了Map接口. 异:HashMap允许null的键值对,非同步的,非线程安全的,效率高: HashTable不允许 ...

  3. break跳出循环的妙用

    while True: temp = input('请输入一个整数:') try: temp = int(temp)#这里如果不是整数的话会引发报错,直接进入 except后面的reason,如果是整 ...

  4. digest-MD5认证

    digest-MD5认证机制是基于MD5算法的LINUX安全机制认证. 会比较用户端传送的杂凑值与使用者密码的杂凑值,以认证用户端. 但由于此机制必须读取使用者密码,因此,所有想透过digest-MD ...

  5. MySQL导致错误的语句

    主键不唯一 由于表定义中创建了主键约束,因此MySQL将会确保重复主键不会被插入到数据表中. INSERT INTO person (person_id, fname, lname, gender, ...

  6. es6中参数【默认值,扩展运算符】

    参数默认值 1.普通参数 function info(age,name="grace"){ console.log(name); } info(); //输入:grace 2.对象 ...

  7. AXIOS源代码重点难点分析

    摘要 vue使用axios进行http通讯,类似jquery/ajax的作用,类似angular http的作用,axios功能强大,使用方便,是一个优秀的http软件,本文旨在分享axios源代码重 ...

  8. 做了两年多salesforce平台开发,转Java的经历

    2015年毕业,转眼已经三年多了.三年对于现在的我,真的很快,一开始对软件开发的执着一直没有变.我是一个很普通很普通长沙的一个专科毕业.刚进大学,对于软件开发真的是小白,仅仅只是存在对于游戏,和桌面软 ...

  9. SQL学习之查询

    查询实例: 1.创建数据库并使用: create database school; use school; 2.创建表并插入内容: create table student( Sno char(9) ...

  10. [Luogu 1559]运动员最佳匹配问题

    Description 题库链接 求 \(2\times N\) 个点的带权二分图最佳匹配. \(1\leq N\leq 20\) Solution 我还是太菜了啊...到现在才学 \(KM\) . ...