定義
用一箇中介對象來封裝一系列的對象交互。中介者使的各個對象不需要顯示地相互引用,從而時期耦合鬆散,而且可以獨立的改變他們之間的交互。
結構與說明
Mediator : 中介者接口
ConcreteMediator : 具體的中介者對象
Colleague : 同事類的定義,通常定義爲抽象類,實現對象的公共功能(比如,對中介者的持有)
實現
//常規的實現方式,省略日誌記錄
/*
*抽象的同事類
*/
publc abstract class Colleague{
private Mediator mediator;
public Colleague(Mediator _mediator){
this.mediator = _mediator;
}
public Mediator getMediator(){
return mediator;
}
....//其他的一些操作
}
/*
*中間者接口
*/
public interface Mediator{
public void changed(Colleague colleague);
}
/*
*具體的同事
*/
public class ConcreteColleague extends Colleague{
public ConcreteColleague(Mediator mediator){
super(mediator);
}
public void someOperation(){
getMediator().changed(this);
}
}
/*
*具體的中介者
*/
public class ConcreteMediator implements Mediator{
private ConcreteColleagueA A;
private ConcreteColleagueB B;
......//A B的set方法
public void changed(Colleague colleague){
//A B之間的協調機制
}
}
一些討論:
- 根據業務規則,中介者的接口並不是一定需要的
- 根據業務實現,同事類並不一定有一致的父類接口
- 根據業務規則,可以將中介者定爲單例模式,在同事類中直接調用
- 根據業務實現,可以不統一通知函數
- 根據業務實現,可以將同事和中介者使用通知者模式,中介者不必持有所有所有的同事類。
滿足上述任意一個要求,都是廣義中介者。
使用中介者模式的時候,千萬別將中介類弄得過於膨脹,中介者是爲了降低耦合,但是過度集中也是設計缺陷。
在學習MVC的時候,其中的C就是Controller,是Model和View的中介對象。