Java设计模式之中介者模式

概述

中介者模式(Mediator)又称为调解者模式或调停者模式,中介者是一中行为型模式,听名字大家应该都知道了起到了中间桥梁的作用,
在软件开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害。
如果有这么一个中间者能够和所有的子系统交互,就会变得清晰的多.中介者模式就起到了这个作用.

定义

中介者包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用.从而使他们可以松散耦合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的相互作用,
保证这些作用可以彼此独立的变化.中介者模式将多对多的相互作用转化为一对多的相互作用,终结者模式将对象的行为和协作抽象化.把对象在小尺度的行为上与其他对象的相互作用分开处理

使用场景

  • 对象间的交互操作很多且每个对象的行为操作都依赖彼此,导致依赖关系结构混乱时.
  • 向通过一个中间类来封装多个类中的行为,而又不行生成太多的子类

UML

中介者模式UML

其中涉及到的角色有:

  • Mediator : 抽象中介者角色,定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.
  • ConcreteMediator : 具体中介者角色,继承于抽象中介者.实现抽象中介者中定义的事件方法,从一个同事类接收消息,然后通过消息影响其他同时类
  • Colleague : 抽象同事类角色,定义了中介者对象的接口,只知道中介者而而不知道其他同事类对象.
  • ConcreteColleague : 具体同事类角色,继承于抽象同事类,只知道本身在小范围内的行为,不知道其在大范围内的目的.

简单实现

中介者模式的例子很多,如我们日常使用的电脑,主板就相当于中介者,cpu,内存,显卡等相当于同事类对象.

  • 首先定义Mediator对象
public abstract class Mediator {
  /**
   * 同事对象改变时通知中介者的方法
   * 在同事对象改变时由中介者去通知其他同事对象
   */
  public abstract void changed(Colleague _colleague);
}
  • 定义Colleague对象
public abstract class Colleague {

  protected Mediator mMediator;//每一个同事都该知道其中介者

  public Colleague(Mediator _mediator){
    this.mMediator = _mediator;
  }
}
  • 具体的Colleague对象
//cpu
public class Cpu extends Colleague {
  private String dataSound;

  public Cpu(Mediator _mediator) {
    super(_mediator);
  }

  public String getDataSound() {
    return dataSound;
  }

  public void load(){
    dataSound = "sound_play_from_cpu";

    mMediator.changed(this);
  }
}

//声卡
public class SoundCard extends Colleague {
  private static final String TAG = "SoundCard";

  public SoundCard(Mediator _mediator) {
    super(_mediator);
  }

  public void soundPlay(String data) {
    Log.d(TAG, "soundPlay: -->" + data);
  }
}
  • 具体的mediator对象
//主板,中介者角色
public class MainBoard extends Mediator {
  private Cpu mCpu;
  private SoundCard mSoundCard;

  @Override public void changed(Colleague _colleague) {
    if (_colleague == mCpu) {
      handleCpu((Cpu) _colleague);
    }
  }

  private void handleCpu(Cpu _colleague) {
    mSoundCard.soundPlay(_colleague.getDataSound());
  }

  public void setCpu(Cpu _cpu) {
    mCpu = _cpu;
  }

  public void setSoundCard(SoundCard _soundCard) {
    mSoundCard = _soundCard;
  }
}
  • 客户端调用
MainBoard mainBoard = new MainBoard();
Cpu cpu = new Cpu(mainBoard);
SoundCard soundCard = new SoundCard(mainBoard);

mainBoard.setCpu(cpu);
mainBoard.setSoundCard(soundCard);

cpu.load();

优缺点

优点:

  • 避免同事类之间的过度耦合,使得各同事类之间可以相互独立的使用
  • 可以将对象间一对多的关联转变为一对一的关联,便于维护
  • 将对象的行为和协作进行抽象,能够比较灵活的处理对象之间相互作用.

缺点:

  • 若果几个类间的依赖关系不复杂,使用中介者模式反而会使逻辑结构变得复杂.
  • 由于中介者封装了系统中对象间的相互关系,导致中介者会变得复杂.

扩展阅读:
23种设计模式(7):中介者模式

实例代码

DesignPatterns

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值