欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/mediator/

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

中介者模式中的角色:

  1. 抽象中介者(Mediator):定义了同事对象到中介者对象之间的接口。
  2. 具体中介者(ConcreteMediator):定义抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收消息,并且向具体的同事类发送信息。
  3. 抽象同事类(Colleague)
  4. 具体同事类(ConcreteColleague):每个具体同事类都只需要知道自己的行为即可,但是它们都需要认识中介者。

案例1:
房屋租赁中介就是一个很好的中介模式,租客只知道自己和中介,房东也只知道自己和中介,但是中介必须知道租客和房东。(在我们的生活中处处充斥着“中介者”,比如租房、买房、出过留学、找工作、旅游等可能都需要哪些中介者的帮助。)
1 抽象中介者

public interface Mediator
{void contact(String message, Person person);
}

2 抽象同事类

public abstract class Person
{protected String name;protected Mediator mediator;Person(String name, Mediator mediator){this.name = name;this.mediator = mediator;}
}

3 具体同事类
房东:

public class HouseOwner extends Person
{HouseOwner(String name, Mediator mediator){super(name, mediator);}public void contact(String message){mediator.contact(message, this);}public void getMessage(String message){System.out.println("HouseOwner : "+name+", Get Message: "+message);}
}

租客:

public class Tenant extends Person
{Tenant(String name, Mediator mediator){super(name, mediator);}public void contact(String message){mediator.contact(message, this);}public void getMessage(String message){System.out.println("Tenant : "+name+", Get Message: "+message);}
}

4 中介

public class MediatorStructure implements Mediator
{private HouseOwner houseOwner;private Tenant tenant;public HouseOwner getHouseOwner(){return houseOwner;}public void setHouseOwner(HouseOwner houseOwner){this.houseOwner = houseOwner;}public Tenant getTenant(){return tenant;}public void setTenant(Tenant tenant){this.tenant = tenant;}@Overridepublic void contact(String message, Person person){if(person == houseOwner){tenant.getMessage(message);}else{houseOwner.getMessage(message);}}
}

5 测试代码

        MediatorStructure mediator = new MediatorStructure();HouseOwner houseOwner = new HouseOwner("qq",mediator);Tenant tenant = new Tenant("jj",mediator);mediator.setHouseOwner(houseOwner);mediator.setTenant(tenant);tenant.contact("I wanna a house");houseOwner.contact("I have~");

运行结果:

HouseOwner : qq, Get Message: I wanna a house
Tenant : jj, Get Message: I have~

优缺点
优点

  1. 适当的使用中介者模式可以避免同事类之间的过渡耦合,使得各同事类之间可以相对独立地使用。
  2. 减少子类的生成。
  3. 可以减少各同事类的设计与实现。

缺点

  1. 由于中介者对象封装了系统中的对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。中介者需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出现问题。所以它比较容易应用也很容易误用。故当系统中出现了“多对多”交互复杂的关系群时,千万别记着使用中介者模式,你首先需要做的就是反思你的系统在设计上是不是合理。再者,在实际工作中,中介者模式也并不多见。

适用场景

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

JDK中的中介者模式:
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()


参考资料

  1. 23种设计模式
  2. 细数JDK里的设计模式
  3. 设计模式读书笔记—–中介者模式

欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/mediator/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


设计模式:中介者模式(Mediator)相关推荐

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

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

  2. 设计模式.中介者模式Mediator

    定义 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式,使得这些对象不必相互明显引用.从而使它们可以较松散地耦合.当这些对象中的某些对象之间的相 ...

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

    1.定义 中介者模式是一种行为型模式,是为了解决对象之间错综复杂的调用关系的一种设计模式,这种错综复杂的调用关系采用一个中介类来进行帮忙调用,所有的调用者只是需要关心中介者,而不需要进行互相依赖. 例 ...

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

    中介者模式 概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 1.一组对象以定义良好但是复杂的方式进行通信. ...

  5. java mediator_浅谈Java设计模式——中介者模式(Mediator)

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

  6. java mediator_关于Java 设计模式 中介者模式 Mediator

    1.Order.java package com.ssm.cts.pattern.mediator; public class Order { public void buyBar(int numbe ...

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

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

  8. 设计模式(10):行为型-中介者模式(Mediator)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

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

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

  10. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

最新文章

  1. 揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%
  2. 利用ngxtop实时监控nginx的访问情况
  3. java map 迭代删除元素,java – 如何在迭代时删除和添加元素到TreeMap?
  4. docker hub 国内镜像_Mac设置docker国内镜像源
  5. 1088 三人行(20 分)
  6. Linux下安装LoadRunner LoadGenerator
  7. linux修改文件句柄数生效_linux系统层面调优和常见的面试题
  8. python如何收集数据_如何从另一个文件导入列表并从中“收集”数据?(Python)...
  9. 全球首发!惯性导航导论(剑桥大学)第十一部分
  10. springmvc与ajax交互常见问题
  11. 【机器学习】机器学习的主要挑战与应对方式
  12. DirectInput手柄在Windows环境下震动实现
  13. python网络安全面试题_网络安全经典面试题(二)
  14. 【恩智浦杯(飞思卡尔)全国大学生智能汽车竞赛】解读部分北科技术报告图像处理内容(点到为止)
  15. UE4_编辑器UMG关闭窗口不能立刻销毁UMG
  16. electron深入浅出
  17. JavaScript——数组——slice方法
  18. Java使用JavaMail收发Email电子邮件
  19. openGL之API学习(五十五)凹凸贴图技术
  20. mail在linux的端口,linux 上mailx通过465端口发送邮件

热门文章

  1. oracle数据结构是什么意思,Oracle数据结构知多少(一)
  2. python整型图_python源码研究之整型对象探索
  3. Smart Link
  4. iOS开发Drag and Drop简介
  5. Hibernate 拦截器的使用--动态表名
  6. 代码需要不断进化和改变
  7. jQuery Sizzle选择器(一)
  8. flashback table肯定会造成rowid跟着修改
  9. java集合概念初步介绍
  10. 从PHP5.2.x迁移到PHP5.3.x