三分钟理解“中介者模式”——设计模式轻松掌握

中介者模式的官方定义:

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

普通情况下ColleagueA向ColleagueB、ColleagueC、ColleagueD对象发送消息:

1.首先,在ColleagueA类中需要有一个sendMessage函数,用于向指定的对象发送消息;

2.其次,所有需要接收消息的对象都必须实现Colleague接口,并实现其中的getMessage函数,用于接收消息。

3.sendMessage()函数的实现如下:

private ColleagueB b = new ColleagueB();

private ColleagueC c = new ColleagueC();

private ColleagueD d = new ColleagueD();

public boolean sendMessage(String mess,Colleague colleague){

if(colleague instanceof(ColleagueB))

b.getMessage(message);

else if(colleague instanceof(ColleagueB))

c.getMessage(message);

else if(colleague instanceof(ColleagueB))

d.getMessage(message);

}

在ColleagueA中必须要先创建ColleagueB、ColleagueC、ColleagueD三个对象,然后调用他们各自的getMessage函数给他们发送消息。

在这种方式中,ColleagueA直接向三个对象发送消息,也就是ColleagueA必须要拥有其他三个对象的引用,这样导致ColleagueA与其他三个对象的藕合度高;若要增加消息接收者的时候,就必须要修改ColleagueA中的代码,这违背了“开放扩展,封闭修改”的原则。

使用“中介者模式”向ColleagueA向ColleagueB、ColleagueC、ColleagueD对象发送消息:

引入中介者之后,ColleagueA中只需要包含Mediator对象,无需发送函数;ColleagueA若要向ColleagueB、ColleagueC、ColleagueD发送消息,只需调用Mediator对象的sendMessage(message,colleague)即可。

由于A只与Mediator打交道,与B、C、D并没有直接的关系,因此实现了A与BCD之间的松藕合。

若要增加接收消息的类,只需在Mediator中增加代码,而无需修改ColleagueA中的代码,从而体现了“开放扩展,封闭修改”。

PS:“开放-封闭”原则是针对客户端而言的,是指当调用者/用户使用了一个类库之后,如果类库的功能要增强的时候,客户端代码应该是不需要做任何修改的,这就体现了“封闭修改”的原则,也就是“封闭修改”是针对客户端而言的,被调用的类库中仍然可能有部分代码需要修改,这是允许的。

中介者模式的优点:

Mediator的出现减少了各个Colleague之间的藕合,使得可以独立地改变和复用各个Colleague和Mediator;

其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

中介者模式的缺点:

由于Mediator中包含了所有的Colleague对象,所有的控制都在Mediator的sendMessage函数中实现,从而使得中介者过于复杂。

何时运用?

中介者模式一般应用于一组对象之间的通信较为复杂,采用中介者连接所有对象,从而降低各个对象之间的藕合度。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

Spring 注解概览

从Java5.0开始,Java开始支持注解。Spring做为Java生态中的领军框架,从2.5版本后也开始支持注解。相比起之前使用xml来配置Spring框架,...

3548
来自专栏老码农专栏

原 荐 ActFramework 发布 1.

1383
来自专栏Jackson0714

IL指令速查

3137
来自专栏芋道源码1024

Java初中级面试题(2)

1897
来自专栏.net core新时代

分布式中Redis实现Session终结篇

  上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那...

1748
来自专栏Java架构沉思录

一文理清Java内存区域

Java虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。根据《Java 虚拟机规范》将 Java虚拟机所管理的内存分为以下几个运...

202
来自专栏Java成神之路

Spring_总结_04_高级配置(四)_bean的作用域

Spring应用上下文中所有的bean默认都是单例的。也就是说,不管一个bean被注入到其他bean多少次,每次注入的都是同一个实例。

392
来自专栏情情说

深入浅出MyBatis:「映射器」全了解

上一篇总结了MyBatis的配置,详细说明了各个配置项,其中提到了映射器,它是MyBatis最强大的工具,也是使用最多的工具。

3136
来自专栏编程

使用 Java 8 Stream 像操作 SQL 一样处理数据(上)

作者:刘亚涛 博客链接:https://my.oschina.net/liuyatao19921025/blog/1608232 几乎每个Java应用都要创建和...

2066
来自专栏机器学习从入门到成神

海量数据处理之Bti-map详解

    所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以...

461

扫描关注云+社区