中介者模式(調停者模式)Mediator

定義:

用一箇中介對象封裝一系列的對象交互,中介者使各對象不須要顯示地相互做用,從而使其耦合鬆散,當某些對象之間的做用發生改變時,不會當即影響其餘的一些對象之間的做用。保證這些做用能夠彼此獨立的變化。中介者將多對多的相互做用轉化爲一對多的相互做用。中介者模式將對象的行爲和協做抽象化,把對象在小尺度的行爲上與其餘對象的相互做用分開處理。前端

中介者模式類圖:

類圖說明:

Mediator:抽象中介者角色,定義了同事對象到中介者對象的接口,通常以抽象類的方式實現。java

ConcreteMediator:具體中介者角色,繼承於抽象中介者,實現了父類定義的方法,它從具體的同事對象接收消息,向具體同事對象發出命令。框架

Colleague:抽象同事類角色,定義了中介者對象的接口,它只知道中介者而不知道其餘的同事對象。ide

ConcreteColleague A/B:具體同事類角色,繼承於抽象同事類,每一個具體同事類都知道自己在小範圍內的行爲,而不知道它在大範圍內的目的。this

使用場景:

中介者模式適用於多個對象之間緊密耦合的狀況,緊密耦合的標準是:在類圖中出現了蜘蛛網狀結構。在這種狀況下必定要考慮使用中介者模式,這有利於把蜘蛛網梳理成星型結構,使本來複雜混亂的關係變得清晰簡單。spa

中介者模式的實現:

// 抽象中介類
public abstract class Mediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

    /**
     * 抽象中介方法,子類實現
     */
    public abstract void method();

    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
}

// 抽象同事類
public abstract class Colleague {
    protected Mediator mediator;  // 中介者對象

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    /**
     * 同事角色的具體行爲,由子類去實現
     */
    public abstract void action();

}

// 具體中介類
public class ConcreteMediator extends Mediator {

    @Override
    public void method() {
        colleagueA.action();
        colleagueB.action();
    }
}

// 具體同事 A
public class ConcreteColleagueA extends Colleague {

    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void action() {
        System.out.println("能夠本身處理");
    }

    // 業務上有依賴的方法,本身處理不了交給中介者
    public void dependActionA() {
        super.mediator.method();
    }
}

// 具體同事 B
public class ConcreteColleagueB extends Colleague {

    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void action() {
        System.out.println("能夠本身處理");
    }

    // 業務上有依賴的方法,本身處理不了交給中介者
    public void dependActionB() {
        super.mediator.method();
    }
}

/**
 * 客戶方法
 */
public void client() {
    Mediator mediator = new ConcreteMediator();
    ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
    ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
    mediator.setColleagueA(colleagueA);
    mediator.setColleagueB(colleagueB);
    // mediator.method();
    colleagueA.action();
    colleagueA.dependActionA();
}

中介者模式在Android中的應用

  • MVC框架

MVC框架中的C(Controller)就是一箇中介者,叫作前端控制器(Front Controller),它的做用就是把M(Model,業務邏輯)和V(View,視圖)隔離開。因此咱們經常使用的Activity就是一箇中介者。code

  • KeyguardViewMediator.java
相關文章
相關標籤/搜索