一、中介者模式简介(Brief Introduction)

中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently。

中介者减少了各个同事对象的耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。

二、解决的问题(What To Solve)

中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。

三、中介者模式分析(Analysis)

1、中介者模式结构

Mediator:抽象中介者,定义了同事对象交互的接口。

ConcreteMediator:具体中介者对象,实现抽象类中的方法,此具体中介者对象需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发送命令。

Colleague类:抽象同事类。

ConcreteColleague1类,ConcreteColleague2:具体同事类,实现抽象同事类中的方法。每一个同时类需要知道中介者对象;每个具体同事类只需要了解自己的行为,而不需要了解其他同事类的情况。

2、源代码

1、中介者类Mediator及其具体实现类ConcreteMediator

/// <summary>

/// The 'Mediator' abstract class

/// </summary>

abstract class Mediator

{

public abstract void Send(string message,Colleague colleague);

}

/// <summary>

/// The 'ConcreteMediator' class

/// </summary>

class ConcreteMediator : Mediator

{

private ConcreteColleague1 _colleague1;

private ConcreteColleague2 _colleague2;

public ConcreteColleague1 Colleague1

{

set { _colleague1 = value; }

}

public ConcreteColleague2 Colleague2

{

set { _colleague2 = value; }

}

public override void Send(string message,Colleague colleague)

{

if (colleague == _colleague1)

{

_colleague2.Notify(message);

}

else

{

_colleague1.Notify(message);

}

}

}

2、抽象同事类Colleague及其实现类ConcreteColleague1、ConcreteColleague2

/// <summary>

/// The 'Colleague' abstract class

/// </summary>

abstract class Colleague

{

protected Mediator mediator;

// Constructor

public Colleague(Mediator mediator)

{

this.mediator = mediator;

}

}

/// <summary>

/// A 'ConcreteColleague' class

/// </summary>

class ConcreteColleague1 : Colleague

{

// Constructor

public ConcreteColleague1(Mediator mediator)

: base(mediator)

{

}

public void Send(string message)

{

mediator.Send(message, this);

}

public void Notify(string message)

{

Console.WriteLine("Colleague1 gets message: "+ message);

}

}

/// <summary>

/// A 'ConcreteColleague' class

/// </summary>

class ConcreteColleague2 : Colleague

{

// Constructor

public ConcreteColleague2(Mediator mediator)

: base(mediator)

{

}

public void Send(string message)

{

mediator.Send(message, this);

}

public void Notify(string message)

{

Console.WriteLine("Colleague2 gets message: "+ message);

}

}

3、客户端代码

static void Main(string[] args)

{

ConcreteMediator m = new ConcreteMediator();

ConcreteColleague1 c1 = new ConcreteColleague1(m);

ConcreteColleague2 c2 = new ConcreteColleague2(m);

m.Colleague1 = c1;

m.Colleague2 = c2;

c1.Send("How are you? JamesHao");

c2.Send("Fine, thanks");

// Wait for user

Console.ReadKey();

}

3、程序运行结果

四.中介者模式案例分析(Example)

1、场景

实现一个聊天室功能,聊城室就是一个中介者,参与聊天的人就是同事对象,如下图所示

AbstractChatroom:抽象聊天室类,做为Participant的交互的中介。

Register()方法:会员注册功能;Send()方法:发送消息功能。

Chatroom:具体聊天室类,实现抽象聊天室类中的方法。

Participant:参与者类,主要有发送消息Send()功能和接受消息Receive()功能。

Beatle类,NonBeatle:参与者类的具体实现,实现父类Paticipant类中的方法。

2、代码

1、抽象聊天室类AbstractChatroom及其具体聊天室Chatroom

/// <summary>

/// The 'Mediator' abstract class

/// </summary>

abstract class AbstractChatroom

{

public abstract void Register(Participant participant);

public abstract void Send(string from, string to, string message);

}

/// <summary>

/// The 'ConcreteMediator' class

/// </summary>

class Chatroom : AbstractChatroom

{

private Dictionary<string, Participant> _participants =new Dictionary<string, Participant>();

public override void Register(Participant participant)

{

if (!_participants.ContainsValue(participant))

{

_participants[participant.Name] = participant;

}

participant.Chatroom = this;

}

public override void Send(string from, string to, string message)

{

Participant participant = _participants[to];

if (participant != null)

{

participant.Receive(from, message);

}

}

}

2、参与者Participant类及其实现Beatle、NonBeatle

/// <summary>

/// The 'AbstractColleague' class

/// </summary>

class Participant

{

private Chatroom _chatroom;

private string _name;

// Constructor

public Participant(string name)

{

this._name = name;

}

// Gets participant name

public string Name

{

get { return _name; }

}

// Gets chatroom

public Chatroom Chatroom

{

set { _chatroom = value; }

get { return _chatroom; }

}

// Sends message to given participant

public void Send(string to, string message)

{

_chatroom.Send(_name, to, message);

}

// Receives message from given participant

public virtual void Receive(string from, string message)

{

Console.WriteLine("{0} to {1}: '{2}'",from, Name, message);

}

}

/// <summary>

/// A 'ConcreteColleague' class

/// </summary>

class Beatle : Participant

{

// Constructor

public Beatle(string name)

: base(name)

{

}

public override void Receive(string from, string message)

{

Console.Write("To a Beatle: ");

base.Receive(from, message);

}

}

/// <summary>

/// A 'ConcreteColleague' class

/// </summary>

class NonBeatle : Participant

{

// Constructor

public NonBeatle(string name)

: base(name)

{

}

public override void Receive(string from, string message)

{

Console.Write("To a non-Beatle: ");

base.Receive(from, message);

}

}

3、客户端代码

static void Main(string[] args)

{

// Create chatroom

Chatroom chatroom = new Chatroom();

// Create participants and register them

Participant George = new Beatle("George");

Participant Paul = new Beatle("Paul");

Participant Ringo = new Beatle("Ringo");

Participant John = new Beatle("John");

Participant Yoko = new NonBeatle("Yoko");

chatroom.Register(George);

chatroom.Register(Paul);

chatroom.Register(Ringo);

chatroom.Register(John);

chatroom.Register(Yoko);

// Chatting participants

Yoko.Send("John", "Hi John!");

Paul.Send("Ringo", "All you need is love");

Ringo.Send("George", "My sweet Lord");

Paul.Send("John", "Can't buy me love");

John.Send("Yoko", "My sweet love");

// Wait for user

Console.ReadKey();

}

3、运行结果

五、总结(Summary)

中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。

参考:http://www.dofactory.com/Patterns/PatternMediator.aspx

转载于:https://www.cnblogs.com/ywqu/archive/2010/02/09/1666196.html

Net设计模式实例之中介者模式(Mediator Pattern)相关推荐

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  2. PHP设计模式之中介者模式(Mediator Pattern)了解下

    咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互, ...

  3. 设计模式-中介者模式(Mediator Pattern)

    设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...

  4. java中介者模式例子_Java中介者模式(Mediator Pattern)

    本篇文章帮大家学习java中介者模式(Mediator Pattern),包含了Java中介者模式(Mediator Pattern)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以 ...

  5. 7.7 中介者模式(Mediator Pattern)

    一. 定义 在现实生活中,常出现多个对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",要求每个对象都必须知道它需要交互的对象.如:每个人必须记住他所有朋友的电话,若朋友中 ...

  6. 《研磨设计模式》chap10 中介者模式Mediator(1)简介

    1. 使用场景 如果电脑没有主板,各个配件的关系为 有主板后: 2. 中介者模式简介:各对象通过中介者来交互 //Mediator.java public interface Mediator { p ...

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

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

  8. 设计模式之中介者模式(Mediator Pattern)

    中介者模式定义 Define an object that encapsulates how a set of objects interact. Mediator promotes loose co ...

  9. [设计模式-行为型]中介者模式(Mediator)

    一句话 又翻译成调停者模式. 就是类似房产中介, 买房.卖方不需要双方直接交涉,交给中介. 概括 解析 MEDIATOR-四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自 ...

最新文章

  1. 32岁!清华大学博导,国家优秀青年科学基金获得者!
  2. 玩转SmartQQ之登录
  3. Golang Study 一 定时器使用
  4. TCP:传输控制协议简单讲解(八)
  5. Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)
  6. ArcEngine 添加字段
  7. 太原理工大学计算机宿舍,2019太原理工大学宿舍怎么样 环境好不好
  8. 使用kibana客户端工具操作ElasticSearch(增删改查一)
  9. ai端到端_如何使用行为树构建端到端的对话式AI系统
  10. oracle10g自带的公共同义词,Oracle10g实战教程第07讲视图、同义词、序列
  11. python集合全排列_python——全排列数的生成方式
  12. 一则故事表达:并发,并行,同步,异步,线程,多线程
  13. 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...
  14. Path of Equal Weight (30 分)
  15. 【Django 2021年最新版教程27】数据库model 查询2个日期范围内的所有日期
  16. pr双击打开图标没反应,下载ZXPSignLib-minimal.dll替换
  17. 软件迭代测试是什么工作,快速迭代的测试人员的思考
  18. 第五届模式识别与人工智能国际会议-PRAI 2022
  19. POWERBUILDER12.6开发实验室管理系统[LIS](四),希森美康XN-350全自动血球计数仪接口
  20. 创造与魔法怎么自建服务器,创造与魔法自建服攻略大全_创造与魔法自建服建造方法、福利_玩游戏网...

热门文章

  1. c语言 炸弹文件,炸弹超人游戏c语言简板
  2. android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?
  3. ESDF建图库voxblox的安装编译过程
  4. display:inline-block,block,inline的区别与用法
  5. 小汤学编程之JavaScript学习day01——认识JS、JS基础语法
  6. go语言结构体作为函数参数,采用的是值传递
  7. mvn本地库导入jar包
  8. struts2 url传参中文乱码
  9. Javascript UserAgent 获取平台及浏览器信息
  10. cocos2d-x的定时器