Java設(shè)計(jì)模式----中介者模式

核心

  • 如果一個(gè)系統(tǒng)中對(duì)象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),對(duì)象之間存在大量多對(duì)多關(guān)系,將導(dǎo)致關(guān)系極其復(fù)雜,這些對(duì)象稱為"同事對(duì)象"。
  • 我們可以引入一個(gè)中介者對(duì)象,使各個(gè)同事對(duì)象只跟中介者對(duì)象打交道,將復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)化解為星形結(jié)構(gòu)。


    中介者模式
package mediator;

// 中介類接口
public interface Mediator {
    void register(String dname,Department d);
    void command(String dname);
}
package mediator;

// 同事類接口
public interface Department {
    void selfAction();      // 做本部門的事情
    void outAction();       // 向經(jīng)理發(fā)出申請(qǐng)
}
package mediator;

public class Finacial implements Department{
    private Mediator mediator;      // 持有中介者(經(jīng)理)的引用

    public Finacial(Mediator mediator) {
        this.mediator = mediator;
        mediator.register("Finacial",this);
    }

    public void selfAction() {
        System.out.println("財(cái)務(wù)部:專心數(shù)錢,打錢");
    }

    public void outAction() {
        System.out.println("財(cái)務(wù)部:匯報(bào)工作,買買買");
    }
}
package mediator;

public class Market implements Department{
    private Mediator mediator;      // 持有中介者(經(jīng)理)的引用

    public Market(Mediator mediator) {
        this.mediator = mediator;
        mediator.register("Market",this);
    }

    public void selfAction() {
        System.out.println("市場(chǎng)部:專心跑業(yè)務(wù)");
    }

    public void outAction() {
        System.out.println("市場(chǎng)部:匯報(bào)工作,申請(qǐng)資金");
        mediator.command("Finacial");
    }
}
package mediator;

import java.util.HashMap;
import java.util.Map;

// 經(jīng)理類
public class President implements Mediator{
    private Map<String,Department> map = new HashMap<String, Department>();
    public void register(String dname, Department d) {
        map.put(dname,d);
    }

    public void command(String dname) {
        map.get(dname).selfAction();
    }
}
package mediator;

public class Client {
    public static void main(String[] args) {
        Mediator mediator = new President();

        Market market = new Market(mediator);
        Development development = new Development(mediator);
        Finacial finacial = new Finacial(mediator);

        market.selfAction();
        market.outAction();
    }
}

輸出:
市場(chǎng)部:專心跑業(yè)務(wù)
市場(chǎng)部:匯報(bào)工作,申請(qǐng)資金
財(cái)務(wù)部:專心數(shù)錢,打錢

中介者模式的本質(zhì)

解耦多個(gè)同事對(duì)象之間的交互關(guān)系。每個(gè)對(duì)象都持有中介者對(duì)象的引用,只跟中介者對(duì)象打交道。我們通過中介者對(duì)象統(tǒng)一管理這些交互關(guān)系。

開發(fā)中常見的場(chǎng)景

  • MVC模式(其中的C,控制器就是一個(gè)中介者對(duì)象。M和V都和他打交道)
  • 窗口游戲程序,窗口軟件開發(fā)中窗口對(duì)象也是一個(gè)中介者對(duì)象
  • 圖形界面開發(fā)GUI中,多個(gè)組件之間的交互,可以通過引入一個(gè)中介者對(duì)象來解決,可以是整體的窗口對(duì)象或者DOM對(duì)象。
  • Java.lang.reflect.Method#invoke()

優(yōu)缺點(diǎn)

中介者模式很容易在系統(tǒng)中應(yīng)用,也很容易在系統(tǒng)中誤用。當(dāng)系統(tǒng)出現(xiàn)了“多對(duì)多”交互復(fù)雜時(shí)的對(duì)象群時(shí),不要急于使用中介者模式,而要先反思你的系統(tǒng)在設(shè)計(jì)上是不是合理。

優(yōu)點(diǎn)

  • Mediator的出現(xiàn)減少了各個(gè)Colleague的耦合,使得可以獨(dú)立地改變和復(fù)用各個(gè)Colleague類和Mediator
  • 由于把對(duì)象如何協(xié)作進(jìn)行了抽象,將中介作為一個(gè)獨(dú)立地概念并將其封裝在一個(gè)對(duì)象中,這樣關(guān)注的對(duì)象就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來,也就是站在一個(gè)更宏觀的角度去看待系統(tǒng)

缺點(diǎn)

  • 由于ConcreteMediator控制了集中化,于是就把交互復(fù)雜性變?yōu)榱酥薪檎叩膹?fù)雜性,這就使得中介者會(huì)變得比任何一個(gè)ConcreteColleague都復(fù)雜。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容