中介者模式(Mediator)

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

腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件。标志是一只戴着红色围巾的小企鹅。QQ注册用户由1999年的2人(马化腾和张志东)到现在已经发展到上亿用户,2014年4月11日21点11分在线人数突破两亿,如今已成为腾讯公司的代表之作,是中国目前使用最广泛的交流软件。

我们都知道用QQ能够点对点地跟别人聊天,也能在讨论组或者QQ群里面一人一句的聊天,如果点对点的聊天是每个人即作为服务器也作为客户端,发送消息和接收消息的话。那多人聊天采用这种结构就会相当的复杂,那我们该怎么办呢?加入一个中介者角色,充当通信服务器,每个人都作为客户端与服务器通信。下面我们就来看看具体实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace Mediator
{//用户接口public interface IUser{//接收消息void receiveMessage(String message);//发送消息void sendMessage(String message);//获得发送的消息内容string getMessage();}//中介者接口public interface IMediator{//注册用户信息void regist(IUser user);//发送消息给所有人void notifyAllMessage(IUser user);}public class ConcreteMediator : IMediator{private IList<IUser> list = new List<IUser>();public void regist(IUser user){if (user!=null && !list.Contains(user)){list.Add(user);}}public void notifyAllMessage(IUser user){for (int i = 0; i < list.Count; i++){if (!list[i].Equals (user)){list[i].receiveMessage(user.getMessage());}}}}//抽象用户信息public abstract class AbstractUser : IUser{protected IMediator mediator;protected String name;protected String message;public AbstractUser(IMediator mediator, string name){this.mediator = mediator;this.name = name;}public void sendMessage(String message){this.message = message;Console.WriteLine(this.name + " 说:" + this.message);mediator.notifyAllMessage(this);}public abstract void receiveMessage(string message);public string getMessage(){return message;}}//用户Apublic class UserA : AbstractUser{public UserA(IMediator mediator, string name): base(mediator, name){mediator.regist(this);}public override void receiveMessage(string message){Console.WriteLine("User A Received Message :" + message);}}//用户Bpublic class UserB : AbstractUser{public UserB(IMediator mediator, string name): base(mediator, name){mediator.regist(this);}public override void receiveMessage(string message){Console.WriteLine("User B Received Message :" + message);}}//用户Cpublic class UserC : AbstractUser{public UserC(IMediator mediator, string name): base(mediator, name){mediator.regist(this);}public override void receiveMessage(string message){Console.WriteLine("User C Received Message :" + message);}}class Program{static void Main(string[] args){//创建聊天室(中介者)IMediator mediator = new ConcreteMediator();//创建用户信息IUser userA = new UserA(mediator, "张三");IUser userB = new UserB(mediator, "李四");IUser userC = new UserC(mediator, "王五");Console.WriteLine("------------------------------------------------------");userA.sendMessage("大家好,我叫张三!初来乍到,请多多关照!");Console.WriteLine();Console.WriteLine("------------------------------------------------------");userB.sendMessage("大家好,我叫李四!欢迎加入!");Console.WriteLine();Console.WriteLine("------------------------------------------------------");userC.sendMessage("我是王五,欢迎欢迎!");Console.WriteLine();Console.WriteLine("------------------------------------------------------");}}
}

类图:

中介者模式包含如下几个角色:
    Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。
    ConcreteMediator(具体中介者):具体中介者角色实现抽象中介者接口,具体协调各个同事类之间的协作。
    Colleague(抽象同事类):定义与中介者之间沟通的接口。
    ConcreteColleague(具体同事类):实现抽象同事角色接口,具体处理与中介者的通信行为。

主要优点:

1.中介者模式简化了对象之间的交互。一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
    2.中介者模式可将各同事对象解耦。

主要缺点:

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

适用场景:

1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。注意是多个对象之前相互依赖。
    2.想定制一个分部在多个类中的行为,而不像生成太多的子类的场合。

相关模式:

1.外观:在外观中,外观角色是构成系统内部复杂子系统的单一窗口,对系统外部提供更高一级的接口。外观是单向的信息传达。
    2.中介者:中介者角色充当着各个同事对象之间信息交互的中间角色。中介者是双向的信息通信。

设计模式 之 中介者相关推荐

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

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

  2. 设计模式(中介者模式-对象去耦)

    声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时 ...

  3. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  5. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  6. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式复习-中介者模式

    #pragma once #include "stdafx.h" #include<map> #include<set> #include<strin ...

  8. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...

  9. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  10. 【Unity3D与23种设计模式】中介者模式(Mediator)

    GoF中定义: 定义一个接口来封装一群对象的互动行为 中介者通过移除对象之间的引用 以减少他们之间的耦合度 并且能改变它们之间的互动独立性 游戏做的越大,系统划分的也就越多 如事件系统,关卡系统,信息 ...

最新文章

  1. linux重命名tar命令,linux常用操作指令4 —— 文件操作相关命令(mkdir、touch、rm、mv、cp、cat 、 find 、tar、chmod)...
  2. 关于Adapter对数据库的查询、删除操作
  3. Android MediaRecorder系统结构
  4. conductor任务域
  5. python locust 能压测数据库_python locust 性能测试:HOOKS钩子方法
  6. Java Mail+MYSQL+Tomcate+jsp实现企业快信系统
  7. php mvc 参数传递数组,PHP MVC在帖子上添加到数组
  8. 和Leo一起做爱字符串的好孩子之 [SDOI2014]数数
  9. tf.keras data
  10. 如何在SQL Server中发现和处理孤立的数据库用户
  11. RTLviewer与TechnologyMapViewer的区别?
  12. 【BZOJ 1038】[ZJOI2008]瞭望塔
  13. nginx js、css多个请求合并为一个请求(concat模块)
  14. 3D旋转相册代码及详细使用教程
  15. 笔记本电脑合上盖子不休眠设置方法
  16. Spark之火可以燎原——访Spark亚太研究院院长、首席专家王家林
  17. 基于matlab的脑瘤mr图像处理_基于电势能改进的区域生长脑肿瘤图像分割
  18. SCI-HUB最新文献网站
  19. Android开发技术学习之下拉刷新功能的实现
  20. 手机摄影-参数(快门)

热门文章

  1. 【Git/GitHub/VSCode】Git提交时使用EMOJI表情、在VS Code中使用emoji commit
  2. 云测试软件详解,云计算存储测试:FIO工具入门与实战
  3. 网页二维码生成器纯js代码带logo图纯前端合成
  4. 【C语言】好题分享——回文对称数
  5. Java NIO三大核心之缓冲区Buffer概述
  6. 关于陌陌和微信表情页与输入法之间切换的问题
  7. 戴尔服务器查看系统事件日志,戴尔笔记本电脑上的 BIOS 事件日志和诊断日志记录...
  8. 17.机器比人更需要通证
  9. appium 配置 IOS
  10. 比尔盖兹CES的最后语录