MediatorPattern中介者模式

中介者模式

1.定義

使用一箇中介對象封裝一系列的對象交互,中介者使用對象不須要顯式的相互做用,從而實降現低耦合度,且能夠獨立改變被封裝的一些列對象之間的交互。java

中介者模式也叫作調停者模式:對象之間的依賴就像戰爭,很混亂,加入一箇中心,全部對象都和中心交流,接受中心的調停處理。編程

中介者模式一般有4個角色ide

AbstractColleague抽象同事類:抽象中介者角色。指定一箇中介者用於與其它同事之間的通訊。this

public abstract class AbstractColleague {

    protected AbstractMediator mediator;

    public AbstractColleague(AbstractMediator mediator) {
        this.mediator = mediator;
    }
}

AbstractMediator抽象類:抽象中介者角色。定義統一的接口,用於各同事角色之間的通訊。code

public abstract class AbstractMediator {

    protected ColleagueOne colleagueOne;

    protected ColleagueTwo colleagueTwo;

    public ColleagueOne getColleagueOne() {
        return colleagueOne;
    }

    public ColleagueTwo getColleagueTwo() {
        return colleagueTwo;
    }

    public void setColleagueOne(ColleagueOne colleagueOne) {
        this.colleagueOne = colleagueOne;
    }

    public void setColleagueTwo(ColleagueTwo colleagueTwo) {
        this.colleagueTwo = colleagueTwo;
    }

    public abstract void executeOne();

    public abstract void executeTwo();
}

Colleague類具體同事類:同事角色。每個同事角色都知道中介者角色,每個同事角色的行爲分爲兩種:一種是自身的行爲,用來改變自身的狀態或處理自身的業務邏輯,而且與其它同事和中介者沒有任何依賴關係,叫作自發行爲。另外一種是必須依賴中介者才能完成的行爲,叫作依賴方法。對象

public class ColleagueOne extends AbstractColleague {

    public ColleagueOne(AbstractMediator mediator) {
        super(mediator);
    }

    /**
     * 自發行爲
     */
    public void selfMethodOne() {
        // 處理本身的業務邏輯
        System.out.println("ColleagueOne的自有方法");
    }

    /**
     * 依賴行爲
     */
    public void depMethodOne() {
        // 處理本身的業務邏輯
        System.out.println("ColleagueOne的依賴方法");

        // 委託中介者處理
        super.mediator.executeOne();
    }
}

public class ColleagueTwo extends AbstractColleague {

    public ColleagueTwo(AbstractMediator mediator) {
        super(mediator);
    }

    /**
     * 自發行爲
     */
    public void selfMethodTwo() {
        // 處理本身的業務邏輯
        System.out.println("ColleagueTwo的自有方法");
    }

    /**
     * 依賴行爲
     */
    public void depMethodTwo() {
        // 處理本身的業務邏輯
        System.out.println("ColleagueTwo的依賴方法");

        // 委託中介者處理
        super.mediator.executeTwo();
    }
}

Mediator類:通用中介者角色。協調各同事角色實現協做行爲,必須依賴各個同事角色。接口

public class Mediator extends AbstractMediator {

    @Override
    public void executeOne() {
        super.colleagueOne.selfMethodOne();
        super.colleagueTwo.selfMethodTwo();
    }

    @Override
    public void executeTwo() {
        super.colleagueTwo.selfMethodTwo();
        super.colleagueOne.selfMethodOne();
    }
}

場景類get

public class Client {

    public static void main(String[] args) {
        // 定義中介者
        AbstractMediator mediator = new Mediator();

        // 定義同事類
        ColleagueOne colleagueOne = new ColleagueOne(mediator);
        ColleagueTwo colleagueTwo = new ColleagueTwo(mediator);

        // 中介者注入同事類
        mediator.setColleagueOne(colleagueOne);
        mediator.setColleagueTwo(colleagueTwo);

        colleagueOne.depMethodOne();

        colleagueTwo.depMethodTwo();
    }
}

2.應用

2.1 優勢

  • 減小類之間的依賴,下降類之間的耦合度

2.2 缺點

  • 中介者會過於膨脹,且邏輯複雜

2.3 使用場景

在面向對象的編程中,對象及對象之間必然會存在依賴關係,存在即合理,不必定有依賴關係則使用中介者模式。中介者模式適用於多個對象之間緊密耦合的狀況,類圖中出現了蜘蛛網狀結構。使用中介者模式有利於將蜘蛛網狀結構梳理爲星型結構。class

  • 調度中心
  • 媒體網關
  • 中介服務