中介者模式

一丶定义

  定义一个中介者对象, 封装一系列对象的交互关系, 使得各对象不必显示的相互引用, 从而使其耦合松散, 而且可以独立的改变它们的交互

二丶理解

  各对象显式地持有对方引用, 用于对象之间的交互, 交互关系形成网状结构, 不利于系统维护以及开发人员的理解. 这时可以定义一个中介者对象, 封装注册各对象的引用, 以及完成对象之间的交互操作. 同事对象之间不能直接交互, 它们之间的交互, 需要委托给中介者对象完成, 即 同事对象除了完成自己本身的操作之外, 只和中介者打交道(符合最少知识原则), 如此一来, 交互关系将由复杂的网状结构变成星型结构.  方便系统维护以及开发人员的理解.

  关键点在于同事对象之间不能直接交互, 交互依赖于中介者完成, 中介者注册管理各同事对象的引用, 以及负责转发消息, 实现他们之间的交互

  1) Mediator 抽象中介者

    用于定义统一的接口, 用于各同事对象之间的交互

  2) Concrete Mediator 具体中介者

    具体中介者持有各同事对象的引用, 负责协调各同事对象的行为以完成协作, 因此具体中介者必须依赖具体同事对象(不符合依赖倒置原则)

  3) Colleague 同事角色

    每个同事角色都知道中介者对象, 而且与其他同事角色通信的时候,都通过中介者协作完成

  每个同事角色都有两种行为:

    a. 自发行为: 同事本身的行为, 如修改自身的状态, 与其他同事或者中介者没有任何的依赖.

    b. 依赖方法: 必须依赖中介者才能完成的行为.

三丶示例

  抽象中介者

public abstract class Mediator {//中介者记录各具体同事类的引用, 用于交互// 也可以是集合类记录,如 List, Mapprotected ConcreteColleague1 colleague1;protected ConcreteColleague2 colleague2;// ------------------------- 因为中介者可以有部分同事类, 所以使用setter, getter 注入同事类public ConcreteColleague1 getColleague1() {return colleague1;}public void setColleague1(ConcreteColleague1 colleague1) {this.colleague1 = colleague1;}public ConcreteColleague2 getColleague2() {return colleague2;}public void setColleague2(ConcreteColleague2 colleague2) {this.colleague2 = colleague2;}// ------------------------------------------ 具体同事类依赖中介者的方法//这种方法其实可以精简成通用的发放 sendMessage(String toColleague, message)public abstract void sendMessageToColleague1(String message);//
    public abstract void sendMessageToColleague2(String message);}

  具体中介者:

public class ConcreteMediator extends  Mediator{  // 具体中介者一般只有一个, 即通用中介者
@Overridepublic void sendMessageToColleague1(String message) {super.colleague1.receiveMessage(message);}@Overridepublic void sendMessageToColleague2(String message) {super.colleague2.receiveMessage(message);}
}

  抽象同事角色:

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

  具体同事角色1:

public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}// ---------- self-methodpublic void selfMethod(){System.out.println("colleague1: 自发行为...");}public void receiveMessage(String message){System.out.println("colleague1收到消息: "+message);}// ---------- dependency-methodpublic void sendMessageToColleague2(String message){ // 同事类之间不能直接交互, 同事类不能完成的工作委托给中介者完成super.mediator.sendMessageToColleague2(message);}}

  具体同事2:

public class ConcreteColleague2 extends Colleague{public ConcreteColleague2(Mediator mediator) {super(mediator);}// ---------- self-methodpublic void selfMethod(){System.out.println("colleague2: 自发行为...");}public void receiveMessage(String message){System.out.println("colleague2收到消息: "+message);}// ---------- dependency-methodpublic void sendMessageToColleague1(String message){ // 同事类之间不能直接交互, 同事类不能完成的工作委托给中介者完成super.mediator.sendMessageToColleague1(message);}}

  具体同事3:

public class ConcreteColleague3 extends Colleague {public ConcreteColleague3(Mediator mediator) {super(mediator);}public void selfMethod(){System.out.println("colleague3: 自发行为...");}public void sendMessageToColleague1(String message){super.mediator.sendMessageToColleague1(message);}public void sendMessageToColleague2(String message){super.mediator.sendMessageToColleague2(message);}
}

  场景类:

public class Client {public static void main(String[] args) {Mediator mediator=new ConcreteMediator();ConcreteColleague1 colleague1=new ConcreteColleague1(mediator);ConcreteColleague2 colleague2=new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.selfMethod();colleague1.sendMessageToColleague2("来自colleague1的贺电...");colleague2.selfMethod();colleague2.sendMessageToColleague1("来自colleague2的贺电...");// 之后新增一个colleague3, 与其他同事类交互很清晰ConcreteColleague3 colleague3=new ConcreteColleague3(mediator);colleague3.selfMethod();colleague3.sendMessageToColleague1("来自colleague3的贺电...");colleague3.sendMessageToColleague2("来自colleague3的贺电...");}}

  

  输出结果:

colleague1: 自发行为...
colleague2收到消息: 来自colleague1的贺电...
colleague2: 自发行为...
colleague1收到消息: 来自colleague2的贺电...
colleague3: 自发行为...
colleague1收到消息: 来自colleague3的贺电...
colleague2收到消息: 来自colleague3的贺电...

  完整源码:  中介者模式

学习资料:

  <设计模式之禅>

  中介者模式|菜鸟教程

  中介者模式(详解版)

转载于:https://www.cnblogs.com/timfruit/p/10990506.html

学习设计模式 - 中介者模式相关推荐

  1. 设计模式---中介者模式

    从前面讲到的设计模式的分类中,我们应该得知中介者模式是行为型模式的一种,旨在处理类或对象如何交互及如何分配职责.  中介者模式又叫做调停者模式,名字跟出国留学中介和房产中介是类似的.拿房产中介来说,现 ...

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

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

  3. 7. 星际争霸之php设计模式--中介者模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  4. 【设计模式】Java设计模式 - 中介者模式

    Java设计模式 - 中介者模式

  5. 设计模式中介者模式-备忘录模式-状态模式

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

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

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

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

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

  8. 设计模式学习笔记--中介者模式(详细笔记)

    文章目录 1. 概述 2. 使用实例 1. 概述 使用背景: 菜鸟教程 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. ...

  9. [设计模式] - 中介者模式

    文章目录 一.中介者模式简介 1. 什么是中介者模式 2. 业务说明 3. 不使用中介者模式的代码实现 二.中介者模式的实现 1. 设计思路 2. 代码实现 三.中介者模式总结 1. 中介者模式的特点 ...

最新文章

  1. 《SolidWorks 2017中文版机械设计从入门到精通)》——1.4 操作环境设置
  2. window cmd 端口查进程
  3. 临时表 DML 产生redo 问题说明
  4. seata-golang 一周年回顾
  5. vivo C/C++工程师 HR视频面试问题总结20180807
  6. 摄像头图像分析目标物体大小位置_一文读懂图像定位及跟踪技术
  7. URAL 1012 K-based Numbers. Version 2(DP+高精度)
  8. 计算机软件毕业论文教师指导记录,毕业论文导师指导记录【毕业论文指导记录(精选多篇)】...
  9. ln: ‘ ‘: hard link not allowed for directory
  10. 什么是PECL电平以及常用的匹配电路
  11. Ubuntu(乌班图),初学Linux的最佳选择
  12. python怎么变大字体_pycharm字体放大缩小设置
  13. 如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)
  14. Unet——pytorch
  15. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h“”?
  16. 网页设计与制作的学习(一)
  17. LSB水印嵌入与提取-灰度图像_Python Version
  18. 特种作战中,如何实施支援和保障计划才能达到作战目的?
  19. pssa系统 中台_神州云动:PaaS赋能企业 打造超级业务中台
  20. ccf-csp202006

热门文章

  1. java url dns_JAVA反序列化-ysoserial-URLDNS
  2. mysql异机备份脚本_mysqldump使用rsync异地全量备份数据库
  3. vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
  4. dataframe 查找特定值_C++初级编程NOIP题:11H1544: 查找特定的值
  5. python逢7过小游戏_while循环拓展:用python做一个逢七过小游戏
  6. linux tomcat守护_linux 设置tomcat为守护进程教程
  7. c语言中isdigit函数_在C / C ++中使用isdigit()
  8. Python输入,输出,Python导入
  9. swift实现队列_Swift队列数据结构实现
  10. 学习Web前端,前景无限光明?