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

中介者模式的官方定义:

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

普通情况下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 条评论
登录 后参与评论

相关文章

来自专栏梧雨北辰的开发录

iOS面试知识总结之问题解决

凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知...

2854
来自专栏程序员的SOD蜜

如何用ORM支持SQL语句的CASE WHEN?

OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: select HName,case whe...

2078
来自专栏木木玲

设计模式 ——— 中介者模式

1743
来自专栏.NET开发那点事

利用IronJs在.NET程序里面跑javascript脚本

what’s dlr The dynamic language runtime (DLR) is a runtime environment that adds...

1888
来自专栏Jerry的SAP技术分享

S/4HANA和CRM Fiori应用的搜索分页实现

在我的博客Paging Implementation in S/4HANA for Customer Management 我介绍了S/4HANA for Cu...

3518
来自专栏DOTNET

设计原则

一、面向对象应用程序开发原则(SOLID) 1单一职责原则(SRP) 定义: 一个类应该只有一个发生变化的原因。这条原则曾被称为内聚性,即一个模块的组成元素之间...

2787
来自专栏程序你好

C# API中的模型和它们的接口设计

712
来自专栏iOS技术

何为代码质量?——用脑子写代码引言正文总结

为什么项目维护困难、BUG 反复?实际上很多时候就是代码质量的问题。代码架构就像是建筑的钢筋结构,代码细节就像是建筑的内部装修,建筑的抗震等级、简装或豪装完全取...

502
来自专栏一枝花算不算浪漫

MyBatis学习总结(七)——Mybatis缓存

33312
来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-组合模式

组合模式: 将对象组合成树形结构以表示‘部分-整体’的层次结构, 使得用户对单个对象和组合对象的使用具有一致性. 解析 组合模式描述了如何将容器和叶子节点进行...

3406

扫码关注云+社区