• 中介者模式定义
    Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. 用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。

  • 中介者模式通用类图

    从以上类图可以看到,中介者模式主要有三个角色:

    • 抽象中介者:抽象中介者角色定义统一的接口,用于各个同事之间的通信。
    • 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。
    • 同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
  • 中介者模式通用代码
    抽象中介者Mediator

public abstract class Mediator {protected ConcreteColleague1 c1;protected ConcreteColleague2 c2;public ConcreteColleague1 getC1() {return c1;}public void setC1(ConcreteColleague1 c1) {this.c1 = c1;}public ConcreteColleague2 getC2() {return c2;}public void setC2(ConcreteColleague2 c2) {this.c2 = c2;}public abstract void doSth1();public abstract void doSth2();
}

抽象同事类Colleague

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

具体中介者

public class ConcreteMediator extends Mediator{@Overridepublic void doSth1() {super.c1.selfMethod1();super.c2.selfMethod2();}@Overridepublic void doSth2() {super.c1.selfMethod1();super.c2.selfMethod2();}
}

具体同事类

public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator _mediator) {super(_mediator);}public void selfMethod1() {//TODO}public void depMethod1() {super.mediator.doSth1();}
}
public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator _mediator) {super(_mediator);}public void selfMethod2() {// TODO}public void depMethod2() {super.mediator.doSth2();}
}
  • 中介者模式实例类图
    相比有很多男生都喜欢金庸的武侠小说吧,笔者也不例外。江湖中门派众多,总会有一些小喽啰偷学少林绝学去做一些见不得人的勾当。前段时间武当派和峨眉派的的弟子被大力金刚指所杀,大力金刚指是少林派的绝学,自古有天下武功出少林的没说,大家自然也不敢轻举妄动。这个时候大家推举出了德高望重的武林盟主,作为江湖的中间人,一旦有什么不和谐的地方,由武林盟主出面进行沟通,其实这个例子就符合中介者模式。

  • 中介者模式实例代码
    抽象中介者类
public abstract class WulinAlliance {abstract void notice(String message, United united);
}

抽象同事类

public abstract class United {protected WulinAlliance wulinAlliance;public United(WulinAlliance wulinAlliance) {this.wulinAlliance = wulinAlliance;}
}

具体同事类

public class Wudang extends United {public Wudang(WulinAlliance wulinAlliance) {super(wulinAlliance);}public void sendAlliance(String message) {wulinAlliance.notice(message, this);}public void getNotice(String message) {System.out.println("武当收到消息:" + message);}
}
public class Shaolin extends United {public Shaolin(WulinAlliance wulinAlliance) {super(wulinAlliance);}public void sendAlliance(String message) {wulinAlliance.notice(message, Shaolin.this);}public void getNotice(String message) {System.out.println("少林收到消息:" + message);}
}
public class Emei extends United {public Emei(WulinAlliance wulinAlliance) {super(wulinAlliance);}public void sendAlliance(String message) {wulinAlliance.notice(message, Emei.this);}public void getNotice(String message) {System.out.println("峨眉收到消息:" + message);}
}

具体中介者类

public class Champions extends WulinAlliance {private Wudang wudang;private Shaolin shaolin;private Emei emei;public void setWudang(Wudang wudang) {this.wudang = wudang;}public void setEmei(Emei emei) {this.emei = emei;}public void setShaolin(Shaolin shaolin) {this.shaolin = shaolin;}@Overridepublic void notice(String message, United united) {if (united == wudang) {shaolin.getNotice(message);} else if (united == emei) {shaolin.getNotice(message);} else if (united == shaolin) {wudang.getNotice(message);emei.getNotice(message);}}
}

客户端调用

public class Client {public static void main(String[] args) {Champions champions = new Champions();Wudang wudang = new Wudang(champions);Shaolin shaolin = new Shaolin(champions);Emei emei = new Emei(champions);champions.setWudang(wudang);champions.setShaolin(shaolin);champions.setEmei(emei);wudang.sendAlliance("武当弟子被少林大力金刚指所杀");emei.sendAlliance("峨眉弟子被少林大力金刚指所杀");shaolin.sendAlliance("少林弟子绝不会做出这种事情");}
}

输出结果:

少林收到消息:武当弟子被少林大力金刚指所杀
少林收到消息:峨眉弟子被少林大力金刚指所杀
武当收到消息:少林弟子绝不会做出这种事情
峨眉收到消息:少林弟子绝不会做出这种事情
  • 中介者模式的优点

    • 符合迪米特原则,将原有的一对多的依赖变成了一对一的依赖,降低类间的耦合。
    • 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
  • 中介者模式的适用场景
    • 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系结构混乱而且难以复用该对象。
    • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

参考书籍:设计模式之禅
实例代码放在这里。

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

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

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

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

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

  3. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  4. 设计模式之中介者模式---Mediator Pattern

    模式的定义 中介者模式定义如下: Define an object that encapsulates how a set of objects interact.Mediator promotes ...

  5. 【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现

    文章目录 简介 伪代码演示 简单实现 使用MediatR实现中介者模式 来源 简介 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类 ...

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

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

  7. java中介者模式例子_Java中介者模式(Mediator Pattern)

    本篇文章帮大家学习java中介者模式(Mediator Pattern),包含了Java中介者模式(Mediator Pattern)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以 ...

  8. 7.7 中介者模式(Mediator Pattern)

    一. 定义 在现实生活中,常出现多个对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",要求每个对象都必须知道它需要交互的对象.如:每个人必须记住他所有朋友的电话,若朋友中 ...

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

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

最新文章

  1. 使用Pyecharts制作Bar3D用法详解
  2. 空函数有参函数调用参数的注意事项Swift 1.1语言
  3. C# 2.0中泛型编程初级入门教程
  4. HDU3634(矩形切割)
  5. 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC
  6. 聊聊并发(四)深入分析ConcurrentHashMap
  7. char与varchar区别(MYISAM)
  8. AngularJS之代码风格36条建议【一】(九)
  9. Oracle DataGuard数据备份方案详解
  10. mysql-5.7.17.msi安装
  11. SQL SERVER 锁定的实例
  12. js基础知识总结大全
  13. 微信小程序tabbar消失_微信小程序tabbar不显示解决办法
  14. 什么是QT(轻松的帮你做带界面的软件)
  15. Matlab的residuez和residue的区别,举例
  16. 如何在 Android 上自定义来电通知?带有代码示例
  17. 容器化技术Docker由入门到实战
  18. 谐振电路及品质因数(三)
  19. 世界上没有哪一份工作是不受气的,哪怕是老板,也会有受气的时候
  20. 马斯洛需求层次五大阶段,你处于那一层呢?

热门文章

  1. 设计模式 -- 装饰模式(Decorator)
  2. MBA关注:长期太忙或太穷人会变傻
  3. 倾斜实景三维中的“我的世界“
  4. mysql双写是什么意思_MYSQL双写和块裂
  5. 计算机毕业设计ssm基于Java通识课程管理系统v87xr系统+程序+源码+lw+远程部署
  6. HTML作业04——简易美食页面
  7. C# PropertyGrid控件应用心得
  8. 基于Java的中国象棋游戏的设计与实现
  9. linux until循环,linux命令:until循环
  10. 李宁体操王子与体操公主的婚礼