天天看點

行為型設計模式之中介者模式中介者模式基本使用

中介者模式

中介者模式又稱為調解者模式或調停者模式,屬于行為型模式。它用一個中介對象封裝系列的對象互動,中介者使各對象不需要顯示地互相作用,進而使其耦合松散,而且可以獨立地改變它們之間的互動。
中介者模式包裝了一系列對象互相作用的方式,使得這些對象不必互相明顯作用。進而使它們可以松散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。其核心思想是,通過中介者解耦系統各層次對象的直接耦合,層次對象的對外依賴通信統統交由中介者轉發。
中介者模式通過提供一個中介類,将系統各層次對象間的多對多關系變成一對多關系,将複雜的網狀結構變成以調停者為中心的星形結構,達到降低系統的複雜性,提高可擴充性的作用。
行為型設計模式之中介者模式中介者模式基本使用

應用場景

當多個類互相耦合,形成了網狀結構,則可以考慮使用中介者模式進行優化。

1、系統中對象之間存在比較複雜的引用關系,導緻它們之間的依賴關系結構混亂而且難以複用該對象。

2、想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。
           

飛行器駕駛員之間不會通過互相溝通來決定下一架降落的飛機。 所有溝通都通過控制塔台進行。

行為型設計模式之中介者模式中介者模式基本使用

主要角色

1.抽象中介者(Mediator)

定義統一的接口,用于各同僚角色之間的通信

2.具體中介者(ConcreteMediator)

從具體的同僚對象接收消息,向具體同僚對象發出指令,協調各同僚間的協作

3.抽象同僚類(Colleague)

每一個同僚對象均需要依賴中介者角色,與其他同僚間通信時,交由中介者進行轉發協作

4.具體同僚類(ConcreteColleague)

負責實作自發行為(Self-Method),轉發依賴方法

優缺點

1.減少類間依賴,将多對多依賴轉化成了一對多,降低了類間耦合;

2.類間各司其職,符合迪米特法則。
           
1.中介者模式中将原本多個對象直接的互相依賴變成了中介者和多個同僚類的依賴關系。當同僚類越多時,中介者就會越臃腫,變得複雜且難以維護。
           

基本使用

建立抽象中介者

public abstract class Mediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

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

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

    // 中介者業務邏輯
    public abstract void transferA();

    public abstract void transferB();
}
           

建立具體中介者

public class ConcreteMediator extends Mediator {
    /**
     * 由具體同僚類A,向具體同僚對象B發出指令
     */
    @Override
    public void transferA() {
        this.colleagueB.selfMethodB();
    }

    /**
     * 由具體同僚類B,向具體同僚對象A發出指令
     */
    @Override
    public void transferB() {
        this.colleagueA.selfMethodA();
    }
}
           

建立抽象同僚類

public abstract class Colleague {
    protected Mediator mediator;

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

建立具體同僚類

public class ConcreteColleagueA extends Colleague {
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
        this.mediator.setColleageA(this);
    }

    /**
     * 自有方法
     */
    public void selfMethodA() {
        System.out.println( this.getClass().getSimpleName()+ "收到中介協作通知,selfMethodA自有方法執行");
    }

    /**
     * 依賴方法
     */
    public void depMethodA() {
        System.out.println( this.getClass().getSimpleName()+ " depMethodA通知中介者進行轉發協作");
        // 中介者進行轉發協作
        this.mediator.transferA();
    }
}
           
public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
        this.mediator.setColleageB(this);
    }

    /**
     * 自有方法
     */
    public void selfMethodB() {
        System.out.println(this.getClass().getSimpleName() + "收到中介協作通知,selfMethodB自有方法執行");
    }

    /**
     * 依賴方法
     */
    public void depMethodB() {
        System.out.println(this.getClass().getSimpleName() + " depMethodB通知中介者進行轉發協作");
        // 中介者進行轉發協作
        this.mediator.transferB();
    }
}
           

用戶端執行

public static void main(String[] args) {
        // 建立抽象中介者
        Mediator mediator = new ConcreteMediator();
        // 具體同僚類
        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
        // 中介者進行轉發協作,A轉發給B
        colleagueA.depMethodA();
        System.out.println("-------------------------");
        // 中介者進行轉發協作,B轉發給A
        colleagueB.depMethodB();
    }
           
ConcreteColleagueA depMethodA通知中介者進行轉發協作
ConcreteColleagueB收到中介協作通知,selfMethodB自有方法執行
-------------------------
ConcreteColleagueB depMethodB通知中介者進行轉發協作
ConcreteColleagueA收到中介協作通知,selfMethodA自有方法執行