设计模式之中介者模式

文章目录


在这里插入图片描述

1.定义

中介者模式,又称仲裁者模式,属于行为型模式的一种。提到中介,现实世界中处处可见,房产中介,保险中介,甚至是婚介所等等。他们都有共同的特性,即面向各种客户,同时拥有各种客户需求的资源信息,作为一个中间角色,为其他相关联的角色提供了简单、统一的纽带。使得不同角色不必直接面向其他角色,而只要统一面向中介就可以了。

同样的原理也同样适用于程序设计,我们平时的系统中往往有大量的对象,且这些对象之间每每之间都有可能互相关联,共同构成了一个复杂的网状图。

对象之间的直接关联无疑会造成一些问题:

  1. 对象之间存在紧耦合的关系,职责混乱,当一个对象发生改变后,与之关联的所有对象也需要同步更新
  2. 每个对象单独发展的机会较少,复用性较低
  3. 由于对象之间相互关联,导致对象的结构也会相对复杂,维护成本高

于是在这个背景下,引入了中介者模式,原理也是类似的,即在所有关联对象之间创建一个中介对象,所有对象之间的通信行为全部由中介对象来维护,对象和对象之间并不直接通信(比如一个类需要调用另外一个类的方法,就需要中介来转发这个调用)。
在引入中介对象之前,我们认为对象图的关系是网状结构,当引入中介对象之后,会使得对象图变为星型结构,eg:
在这里插入图片描述
如此,对象之间的耦合自然也就消失了,但是和中介对象之间存在一定的耦合性,所以属于一种松耦合的结构。除此以外,由于中介对象的加入,使得对象之间的通信变得透明,即一个对象并不知道其他的具体情况,也不需要告诉中介需要怎么做,具体的逻辑有中介对象根据实际情况完成。

既然有优点,那自然缺点也是显而易见的,那就是中心化的问题, 所有对象都和中介对象建立了关系,换句话说,对象之间的通信必须通过中介对象,如果中介对象发生意外,则可能会将问题快速蔓延至所有与之关联的对象。故使用中介者模式的时候,还是需要根据实际情况出发。

中介者模式中有以下角色:

  • 抽象中介者角色(Mediator):中介的抽象接口,提供同事对象注册和转发同事对象信息的抽象方法,同事对象就是中介面对的需要协调的对象
  • 具体中介者橘色(Concrete Mediator):实现中介者接口,管理同事对象,协调各个同事角色之间的关系,依赖于同事角色
  • 抽象同事类角色(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能
  • 具体同事类角色(Concrete Colleague):具体同事类实现,对抽象同事进行实现,当需要与其他同事对象通信时,由中介者对象负责后续的交互

UML:
在这里插入图片描述
图片来源:知乎

2.示例

以一个简单示例对以上角色进行实现,首先是同事类抽象,同事类应持有中介对象(没有中介就没办法找房子),提供两个方法,changed方法是在当前对象发生变化时调用,该方法实现至少应该将变化通知到中介,update方法则是其他关联对象发生改变后,由中介主动调用的方法,该方法应该实现关联对象发生改变后当前对象应该怎么做

/**
 * @description: 抽象同事类
 * @version: 1.0
 */
public abstract class Colleague {
   

    protected Mediator mediator;

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

    //更新操作
    public abstract void update(</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值