概述
中介者模式(Mediator
)又称为调解者模式或调停者模式,中介者是一中行为型模式,听名字大家应该都知道了起到了中间桥梁的作用,
在软件开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害。
如果有这么一个中间者能够和所有的子系统交互,就会变得清晰的多.中介者模式就起到了这个作用.
定义
中介者包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用.从而使他们可以松散耦合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的相互作用,
保证这些作用可以彼此独立的变化.中介者模式将多对多的相互作用转化为一对多的相互作用,终结者模式将对象的行为和协作抽象化.把对象在小尺度的行为上与其他对象的相互作用分开处理
使用场景
- 对象间的交互操作很多且每个对象的行为操作都依赖彼此,导致依赖关系结构混乱时.
- 向通过一个中间类来封装多个类中的行为,而又不行生成太多的子类
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):中介者模式