原文地址 http://blog.csdn.net/qq_25806863/article/details/69396448

中介者模式又叫调解者模式或调停者模式,是行为型设计模式之一。

生活中的中介者的作用就是连接两方的一个桥梁,比如房产中介,买房的只需跟中介打交道,然后买房的也跟着中介打交道,

没有中介的时候是这样的:

每个买房的和卖房的都要和很多对方打交道,有了新的买房人,这些卖房的都得知道才能去和他联系。

有了中介者之后:

所有买房的和卖房的都只需要跟中介者一个人打交道,买房的不需要知道卖房的是什么人,有多少卖房的等等。都省事了很多。

定义

通过中介者包装一系列对象的交互,使得这些对象不必相互显式引用,从而使它们可以松散耦合。

当某些对象之间的作用发生变化是,不会立即影响其他对象间的作用,保证这些作用协议彼此独立的变化。

中介者模式将多对多的相互作用转化为一堆多的相互作用。

使用场景

  • 多个对象之间的交互操作很多,每个对象的行为都依赖批次,形成网状的多对多结构,为了防止修改一个对象时要修改很多其他对象,可以用中介者模式。

UML

  • Mediator: 抽象的中介者角色,定义了同事对象到中介者的接口。
  • ConcreteMediator:具体的中介者角色,从具体的同事对象接收消息,同时向具体的同事对象发出命令。
  • Colleague:抽象同事类角色,定义了中介者对象的接口,只知道中介而不知道其他同事对象。
  • ConcreteColleagueA,B:具体的同事类角色,每个具体同事类都知道本身在小范围内的行为,而不知道他在大范围中的行为。

模板代码:

抽象的中介者:

public interface Mediator {void change();
}

具体的中介者:

public class ConcreteMediator implements Mediator {public ConcreteColleagueA concreteColleagueA;public ConcreteColleagueB concreteColleagueB;public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {this.concreteColleagueA = concreteColleagueA;}public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {this.concreteColleagueB = concreteColleagueB;}@Overridepublic void change() {concreteColleagueA.action();concreteColleagueB.action();}
}

抽象的同事:

public abstract class Colleague {public Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void action();
}

具体的同事:

public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("交给中介做A的事情");}
}
public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("交给中介做B的事情");}
}

简单实现

以电脑为例子。CPU,显卡,内存等零件的交互都是通过主板实现的,而且每个零件只需要做好自己的工作,不需要知道其他零件是什么。所以主板可以作为他们的中介者。

抽象的中介者:

public abstract class Mediator {public abstract void change(Colleague colleague);
}

具体的中介者,主板:

public class MainBoard extends Mediator {private CDDevice cdDevice;private CPU cpu;private GraphicsCard graphicsCard;private SoundCard soundCard ;@Overridepublic void change(Colleague colleague) {if (colleague==cdDevice){handleCD((CDDevice) colleague);}if (colleague==cpu){handleCPU((CPU) colleague);}}private void handleCD(CDDevice  cdDevice){cpu.decodeData(cdDevice.read());}private void handleCPU(CPU cpu){soundCard.playSound(cpu.getDataSound());graphicsCard.vidoePlay(cpu.getDataVideo());}public void setCdDevice(CDDevice cdDevice) {this.cdDevice = cdDevice;}public void setCpu(CPU cpu) {this.cpu = cpu;}public void setGraphicsCard(GraphicsCard graphicsCard) {this.graphicsCard = graphicsCard;}public void setSoundCard(SoundCard soundCard) {this.soundCard = soundCard;}
}

抽象的零件:

public abstract class Colleague {public Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}

具体的零件:

public class CPU extends Colleague {private String dataVideo,dataSound;public CPU(Mediator mediator) {super(mediator);}public String getDataVideo(){return dataVideo;}public String getDataSound() {return dataSound;}//解析数据,分割音频和视频public void decodeData(String data){String[] tmp = data.split(",");dataVideo=tmp[0];dataSound=tmp[1];mediator.change(this);}
}
public class CDDevice extends Colleague {private String data;public CDDevice(Mediator mediator) {super(mediator);}public String read(){return data;}public void load(){data="视频数据,音频数据";mediator.change(this);}
}
public class GraphicsCard extends Colleague {public GraphicsCard(Mediator mediator) {super(mediator);}public void vidoePlay(String data){System.out.println("播放视频:"+data);}
}
public class SoundCard extends Colleague {public SoundCard(Mediator mediator) {super(mediator);}public void playSound(String data){System.out.println("播放音频:"+ data);}}

总结

在面向对象编程中,一个类必然会与其他类产生依赖关系,当依赖关系错综复杂时,可以考虑用中介者模式进行解耦。

优点

  • 降低类的关系复杂度,将多对多转化成一对多,实现解耦。
  • 符合迪米特原则(最少知识原则)

缺点

  • 中介者要做很多事,会变得庞大且难以维护。
  • 如果本来关系并不复杂,那么使用中介者可能会让关系变得更复杂。

Android设计模式(十六)-中介者模式相关推荐

  1. 设计模式(十六)----结构型模式之代理享元模式

    1.概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免大量相似对象的开销,从而提高系统资源的利用率. 2 结构 享元(Flywei ...

  2. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  3. 【大话设计模式】模式十:中介者模式

    [引入] 国与国之间的关系,类似于对象与对象之间的关系,这就要求对象之间需要知道其他所有对象.但是对象之间大量的链接使得一个对象不可能在没有其他对象支持下工作,系统表现为一个不可分割的整体,降低其可复 ...

  4. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  5. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看."中介者模式& ...

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

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

  7. java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon

    设计模式目录 >> 当前页 设计模式之Mediator(中介者) 板桥里人 http://www.jdon.com 2002/05/05 Mediator中介者模式定义: 用一个中介对象来 ...

  8. Android设计模式详解之建造者模式

    前言 Builder模式是一种创建型设计模式. 定义:将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示. 使用场景: 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部 ...

  9. 【Java开发】设计模式 17:中介者模式

    1 中介者模式介绍 中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.在这个模式中,中介者 ...

  10. 设计模式学习之中介者模式

    我们平时写代码的过程,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当地使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,本篇博 ...

最新文章

  1. XDP/eBPF — BPF
  2. UA MATH564 概率论 样本均值的偏度与峰度
  3. mysql行列转换_Excel、SQL、Python分别实现行列转换
  4. Exchange Connector 访问报错解决方法一
  5. 如何合理的规划一次 JVM 性能调优
  6. 苹果隐私追踪新规发布后 Android广告支出涨10%
  7. spring test---restful与文件上传
  8. 句句真研—每日长难句打卡Day10
  9. opencv之解决对加载图片大小限制的问题
  10. 坐标计算机在线使用,经纬度换算器(度分秒计算器在线使用)
  11. SVD奇异值分解简述
  12. 信息安全-网络安全风险评估技术原理与应用(二)
  13. 红帽子linux返回上层目录,【IT技术分享】红帽RHCSA/RHCE/RHCA Linux常用目录、命令、权限技术学习...
  14. Unity零基础到入门 ☀️| 游戏引擎 Unity 从0到1的 系统学习 路线【全面总结-建议收藏】!
  15. kafka配置SASL
  16. MATLAB贝茨极限,2014诺贝尔化学奖:突破光学显微极限
  17. python如何取消换行_python怎么取消换行
  18. javascript判断常用浏览器版本和类型兼容处理
  19. 美版有锁iphone4怎么突然连不上网了
  20. 上海第二家K11项目动工;v2food获近3.5亿元B+轮融资;华彬快消品贵州功能饮料生产基地投产...

热门文章

  1. python自动生成采集规则_快速制作规则及获取规则提取器API
  2. P1598垂直柱状图
  3. 一文带你重新审视CAP理论与分布式系统设计
  4. AI学习之路(19)TensorFlow里的矩阵乘法
  5. MATLAB绘制“问题儿童表情包”动图2
  6. odoo14学习速记笔记
  7. 新课程盘古人工智能框架开发专题发布,智华欢迎读者学习!
  8. 三点定位算法--用于平面2D定位
  9. 云原生和云计算的区别介绍
  10. 周鸿祎360新手机真的会免费吗?