設計模式:中介者模式(Mediator)

定義與結構

中介者模式(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章