1、模式简介

中介者模式的定义:

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

中介者模式中的组成部分:

  • 同事类:如果两个类对象之间可以彼此影响,则称这两个类为同事类;
  • 中介者:中介者中有所有同事类的引用,定义了各个同事类之间交互的抽象方法。

中介者模式的工作方式:

  如下两幅图所示,有6个同事类,它们之间的交互方式如下图所示。这样的话,当对象1发生变化,将影响对象2、4、5、6;当对象2发生变化时,将影响对象1、3、4、5、6。这样不仅实现起来麻烦,而且不易于维护。

  如果引入中介者,其工作情况将如下图所示。可以看到,同事类之间两两都没有了关联,都是与中介者联系了。

中介者模式的优点:

  • 降低了类的复杂度,将一对多转化成了一对一;
  • 各个类之间的解耦;
  • 符合对象之间“高内聚、低耦合”的原则。

中介者模式的缺点:

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

中介者模式的使用场景:

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

2、案例

  在这个案例中,我们模拟一个聊天室的功能:

  • 创建一个聊天室;
  • 向聊天室中添加用户;
  • 当某一个用户发布消息的时候,其他用户都可以收到消息。

  具体代码如下:

  用户类User中的代码:

public class User {
private String name; public User(String name) {
this.name = name;
} public String getName() {
return name;
} public void sendMessage(ChatRoom chatRoom, String message) {
System.out.println(name + "发出消息:" + message);
chatRoom.operateMessage(new Message(this, message));
}
}

  消息类Message中的代码:

public class Message {
private User fromUser;
private String content; public Message() {
} public Message(User fromUser, String content) {
this.fromUser = fromUser;
this.content = content;
} public User getFromUser() {
return fromUser;
} public void setFromUser(User fromUser) {
this.fromUser = fromUser;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}

  聊天室类ChatRoom中的代码:

public class ChatRoom {
private List<User> users; public ChatRoom() {
System.out.println("聊天室开启!!");
users = new ArrayList<User>();
} public void addUser(User user) {
System.out.println(user.getName() + "加入了聊天室!");
users.add(user);
} public void operateMessage(Message message) {
User fromUser = message.getFromUser();
for (User user : users) {
if (fromUser != user) {
System.out.println(user.getName() + "收到了来自" + fromUser.getName() + "的消息:" + message.getContent());
}
}
}
}

  测试类Test中的代码:

public class Test {
public static void main(String[] args) {
// 初始化聊天室对象
ChatRoom chatRoom = new ChatRoom();
// 向聊天室中添加用户
User chatter1 = new User("Chatter1");
User chatter2 = new User("Chatter2");
User chatter3 = new User("Chatter3");
User chatter4 = new User("Chatter4");
User chatter5 = new User("Chatter5");
User chatter6 = new User("Chatter6");
chatRoom.addUser(chatter1);
chatRoom.addUser(chatter2);
chatRoom.addUser(chatter3);
chatRoom.addUser(chatter4);
chatRoom.addUser(chatter5);
chatRoom.addUser(chatter6);
System.out.println();
// 用户之间开始交流
chatter1.sendMessage(chatRoom, "大家好,我是Chatter1");
System.out.println();
chatter4.sendMessage(chatRoom, "你好,Chatter1");
}
}

  运行结果如下图所示:

  最后贴出中介者模式的GitHub代码地址:【GitHub - Mediator】

【设计模式 - 17】之中介者模式(Mediator)的更多相关文章

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

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

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

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

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

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

  4. java设计模式-----17、中介者模式

    概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...

  5. 《JAVA设计模式》之中介者模式(Mediator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...

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

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

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

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

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

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

  9. 大话设计模式Python实现-中介者模式

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

  10. Java设计模式系列之中介者模式

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

随机推荐

  1. linux shell获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用 ...

  2. lamp环境中的/到底是指的网站根目录还是linux的根

    在lamp中经常会用到 require,require_once等包含文件的语句. 如果你使用相对路径没有问题. 但是如果你使用了这样的语句就要小心了. 对于如图网站目录 require_once ' ...

  3. 精通 Oracle+Python,第 6 部分:Python 支持 XML

    无可辩驳的是,XML 现在是软件中信息交换的实际标准. 因此,Oracle 数据库附带了各种与 XML 相关的增强和工具,它们统称为 Oracle XML DB.XML DB 包含一系列嵌入到数据库中 ...

  4. windows 基础及基本软件测试环境搭建

  5. LightOJ_1248 Dice (III)

    题目链接 题意: 给一个质地均匀的n的骰子, 求投掷出所有点数至少一次的期望次数. 思路: 这就是一个经典的邮票收集问题(Coupon Collector Problem). 投掷出第一个未出现的点数 ...

  6. BZOJ 4013 实验比较

    Description 小D被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有\(N\)张图片,编号为\(1\)到\(N\).实验分若干轮进行,在每轮实验中,小\(D\)会被要 ...

  7. ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?

    由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初 ...

  8. C语言头文件的作用

    C99中规定, 所有顶层的默认存储类标志符都是extern ! 头文件中声明的函数,默认都是extern前缀.但是为了我们程序员方便,我们采取下面的手段: 我个人认为是extern催生了头文件的诞生. ...

  9. Windows多桌面切换(CreateDesktop,SwitchDesktop函数)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  10. 利用row_number over 函数删除重复记录

    开窗函数                Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行 SQ ...