原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。

中介者模式(Mediator Pattern)
是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

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

主要解决:
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:
多个类相互耦合,形成了网状结构。

如何解决:
将上述网状结构分离为星型结构。

关键代码:
对象 Colleague 之间的通信封装到一个类中单独处理。

现实类比:
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点:
1、降低了类的复杂度,将一对多转化成了一对一。 (拿上面的例子对比:中国-各个国家 变成 中国-WTO)
2、各个类之间的解耦。
3、符合迪米特原则。

缺点:
中介者会庞大,变得复杂难以维护。

使用场景:
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:
不应当在职责混乱的时候使用。

代码实现:
我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息。
MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。

中介者模式的 UML 图

步骤 1
创建中介类。
ChatRoom.java

import java.util.Date;public class ChatRoom {public static void showMessage(User user, String message){System.out.println(new Date().toString()+ " [" + user.getName() +"] : " + message);}
}

步骤 2
创建 user 类。
User.java

public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name){this.name  = name;}public void sendMessage(String message){ChatRoom.showMessage(this,message);}
}

步骤 3
使用 User 对象来显示他们之间的通信。
MediatorPatternDemo.java

public class MediatorPatternDemo {public static void main(String[] args) {User robert = new User("Robert");User john = new User("John");robert.sendMessage("Hi! John!");john.sendMessage("Hello! Robert!");}
}

步骤 4
验证输出。

Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

到目前为止,学到的需要第三方来处理当前两个对象的交互的有三个设计模式:
代理模式 外观模式和中介者模式,不知道读者是否觉得三者很像,如果是,推荐看这篇文章,讲的还是挺好的:
http://blog.csdn.net/xdd19910505/article/details/24793099

设计模式笔记十八:中介者模式相关推荐

  1. 设计模式笔记 16. Mediator 中介者模式(行为型模式)

    16. Mediator 中介者模式           2008-09-09 动机(Motivation) 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关 ...

  2. 设计模式笔记十五:命令模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 命令模式(Command Pattern) 是一种数据驱动的设计模式,它 ...

  3. 设计模式笔记十六:解释器模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 解释器模式(Interpreter Pattern) 提供了评估语言的语 ...

  4. 设计模式笔记十:装饰器模式

    原文:http://www.runoob.com/design-pattern/ (大部分摘抄) 少许个人理解,如有错误请指出.欢迎一起讨论. 装饰器模式(Decorator Pattern) 允许向 ...

  5. 大话设计模式笔记(八)の模板方法模式

    举个栗子 问题描述 小时候数学老师的随堂测验,都是在黑板上抄题目,然后再作答案.写一个抄题目的程序. 简单实现 学生甲抄的试卷 /*** 学生甲抄的试卷* Created by callmeDevil ...

  6. 设计模式笔记十九:备忘录模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 备忘录模式(Memento Pattern)(本文大部分摘自原文) 保存 ...

  7. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  8. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  9. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

最新文章

  1. python读写csv确定编码格式_Python使用utf8编码读写csv文件
  2. mysql 必须掌握的工具pt-query-digest安装
  3. Day18 (二)反射
  4. Activity的跳转及返回值,activity的生命周期
  5. java迭代器 异常_java.util.NoSuchElementException在Java中使用迭代器
  6. [Django]网页中利用ajax实现批量导入数据功能
  7. Ant Design Tabs标签页隐藏的标签内元素无法获取到
  8. mongodb比较操作符笔记
  9. 蓝桥杯 入门训练 序列求和
  10. 微服务-封装-docker by daysn大雄
  11. 使用Origin从图片中准确提取数据
  12. 【项目实战】Python基于Apriori关联规则算法实现商品零售购物篮分析
  13. 深度学习教程(2) | 神经网络基础(吴恩达·完整版)
  14. 雷蛇游戏软件显示无法访问服务器,亦工作亦游戏 Razer雷云设置技巧-鼠标设置软件...
  15. 201671030119 词频统计软件项目报告
  16. VS2019 团队资源管理器--Git的使用(二)
  17. 来,和人工智能对对联过大年!
  18. 用户画像第二章(企业级360°用户画像_数据调研及ETL)
  19. C. Garland dp
  20. Hazelcast IMDG参考中文版手册-第三章-概述

热门文章

  1. Shell中 2/dev/null
  2. 20180802总结
  3. [LeetCode]657.Judge Route Circle
  4. Ubuntu apt-get方式安装Subversion
  5. fastjson和json-lib的区别
  6. DataTable的Merge方法和添加datatable到dataset
  7. leetcode 121 python(动态规划)
  8. php nb2br,PHP中基本符号及使用方法
  9. CCF202104-2 邻域均值
  10. C语言课后习题(29)