JAVA 设计模式 中介者模式

用途

中介者模式 (Mediator)

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

中介者模式是一种行为型模式

结构

图-中介者模式结构图

Mediator : 为 Colleague 对象定义一个交流接口。

abstract class Mediator {
 public abstract void Send(String message, Colleague colleague);
 }

ConcreteMediator : 实现 Mediator 中的交流接口。 这个类中需要了解并维护所有的 colleague 对象。

class ConcreteMediator extends Mediator {
 private ConcreteColleague1 colleague1;
 private ConcreteColleague2 colleague2;
 
 public void setColleague1(ConcreteColleague1 colleague1) {
 this.colleague1 = colleague1;
     }
 
 public void setColleague2(ConcreteColleague2 colleague2) {
 this.colleague2 = colleague2;
     }
 
     @Override
 public void Send(String message, Colleague colleague) {
 if (colleague == colleague1) {
             colleague2.Notify(message);
         } else if (colleague == colleague2){
             colleague1.Notify(message);
         } else {
             System.out.println("Error!");
         }
     }
 }

Colleague组 : 每个 Colleague 对象应该知道它的 Mediator 对象,但不知道其他同事对象。它只能联系 Mediator 对象。

abstract class Colleague {
 protected Mediator mediator;
 
 public Colleague(Mediator mediator) {
 this.mediator = mediator;
     }
 
 public void Send(String message) {
         mediator.Send(message, this);
     }
 
 public abstract void Notify(String message);
 }
 
 class ConcreteColleague1 extends Colleague {
 public ConcreteColleague1(Mediator mediator) {
 super(mediator);
     }
 
     @Override
 public void Notify(String message) {
         System.out.println("同事1得到信息:" + message);
     }
 }
 
 class ConcreteColleague2 extends Colleague {
 public ConcreteColleague2(Mediator mediator) {
 super(mediator);
     }
 
     @Override
 public void Notify(String message) {
         System.out.println("同事2得到信息:" + message);
     }
 }

测试代码

public class MediatorPattern {
 public static void main(String[] args) {
         ConcreteMediator mediator = new ConcreteMediator();
         ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
         ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
 
         mediator.setColleague1(colleague1);
         mediator.setColleague2(colleague2);
 
         colleague1.Send("How are you?");
         colleague2.Send("Fine, thank you. And you?");
         colleague1.Send("I'm fine. Thankes.");
     }
 }

运行结果

 同事2得到信息:How are you?
 同事1得到信息:Fine, thank you. And you?
 同事2得到信息:I'm fine. Thankes.

应用场景

中介者模式一般用于定义良好但是交互较为负责的对象集合。产生的相互依赖关系是无结构化的并且难以理解。

和很多其他对象有引用关系以及交互的对象很难被重用。

想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java、Spring、技术分享

Netty NioEventLoop源码解读

  NioEventLoop中维护了一个线程,线程启动时会调用NioEventLoop的run方法,执行I/O任务和非I/O任务:I/O任务:即selectio...

1383
来自专栏石奈子的Java之路

原 SpringBoot 2.0 系列00

1304
来自专栏YoungGy

hadoop_入门1

体系结构 概述 hdfs mapreduce yarn cloudera 读取文件 数据管理与容错 数据块复制 心跳检测 二级namenode主要用于备份 HD...

2376
来自专栏GreenLeaves

oracle 层次化查询(生成菜单树等)

1、简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的...

1978
来自专栏刘望舒

LeakCanary看这一篇文章就够了

LeakCanary是Square公司基于MAT开源的一个内存泄漏检测工具,在发生内存泄漏的时候LeakCanary会自动显示泄漏信息。

5845
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第三部分)

当我们尝试调用带有错误参数的Java代码时,通常会产生此Java错误消息(@ghacksnews):

1203
来自专栏wannshan(javaer,RPC)

Spring 事件传播机制分析

Spring4.0.4 Spring 事件机制采用的是观察者模型(又叫订阅发布模型) 有以下角色 ? 这里,观察者就是监听者,被观察者就是事件对象。 事件发布流...

34610
来自专栏数据之美

hadoop 里执行 MapReduce 任务的几种常见方式

说明: 测试文件: echo -e "aa\tbb \tcc\nbb\tcc\tdd" > 3.txt hadoop fs -put 3.txt /tm...

1958
来自专栏wOw的Android小站

[设计模式]之八:中介者模式

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

1081
来自专栏Java学习网

常见的 Java 错误及避免方法之第五集(每集10个错误后续持续发布)

当输入期间意外终止文件或流时,将抛出“EOFException”。 以下是抛出EOFException异常的一个示例,来自JavaBeat应用程序:

1113

扫码关注云+社区