定義與結構
中介者模式(Mediator Pattern)是用來降低多個對象和類之間的通信複雜性。這種模式提供了一箇中介類,該類通常處理不同類之間的通信,並支持鬆耦合,使代碼易於維護。中介者模式屬於行爲型模式。GOF 給調停者模式下的定義是:用一箇中介類對象來封裝一系列的對象交互。調停者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
簡單點來說,將原來兩個直接引用或者依賴的對象拆開,在中間加入一個“調停”對象,使得兩頭的對象分別和“調停”對象引用或者依賴。
當然並不是所有的對象都需要加入“調停”對象。如果對象之間的關係原本一目瞭然,調停對象的加入便是“畫蛇添足”。
來看下調停者模式的組成部分吧。
1) 抽象調停者(Mediator)角色:抽象調停者角色定義統一的接口用於各同事角色之間的通信。
2)具體調停者(Concrete Mediator)角色:具體調停者角色通過協調各同事角色實現協作行爲。爲此它要知道並引用各個同事角色。
3)同事(Colleague)角色:每一個同事角色都知道對應的具體調停者角色,而且與其他的同事角色通信的時候,一定要通過調停者角色協作。
中介者模式的實現
//抽象調停者角色--Mediator
public interface IMediator {
public void fight();
public void talk();
public void registerA(ColleagueA a);
public void registerB(ColleagueB a);
}
//具體調停者角色--ConcreteMediator
public class ConcreteMediator implements IMediator{
ColleagueA talk;
ColleagueB fight;
public void registerA(ColleagueA a){
talk = a;
}
public void registerB(ColleagueB b){
fight = b;
}
public void fight(){
System.out.println("Mediator is fighting");
//let the fight colleague do some stuff
}
public void talk(){
System.out.println("Mediator is talking");
//let the talk colleague do some stuff
}
}
//抽象同事角色--Colleague
public abstract class Colleague {
IMediator mediator;
public abstract void doSomething();
}
//具體同事角色--ConcreteColleagueA
public class ColleagueA extends Colleague {
public ColleagueA(IMediator mediator) {
this.mediator = mediator;
}
@Override
public void doSomething() {
this.mediator.talk();
this.mediator.registerA(this);
}
}
//具體同事角色--ConcreteColleagueB
public class ColleagueB extends Colleague {
public ColleagueB(IMediator mediator) {
this.mediator = mediator;
this.mediator.registerB(this);
}
@Override
public void doSomething() {
this.mediator.fight();
}
}
//測試類
public class MediatorTest {
public static void main(String[] args) {
IMediator mediator = new ConcreteMediator();
ColleagueA talkColleague = new ColleagueA(mediator);
ColleagueB fightColleague = new ColleagueB(mediator);
talkColleague.doSomething();
fightColleague.doSomething();
}
}
驗證輸出
Mediator is talking
Mediator is fighting