設計模式(十六)中介者設計模式

1.定義:

中介者模式(Mediator Pattern)是用來降低多個對象和類之間的通信複雜性。這種模式提供了一箇中介類,該類通常處理不同類之間的通信,並支持松耦合,使代碼易於維護。中介者模式屬於行爲型模式。

2.使用場景

中介者模式很容易實現呢,但是也容易誤用,不要着急使用,先要思考你的設計是否合理。
當對象之間的交互變多時,爲了防止一個類會涉及修改其他類的行爲,可以使用中介者模式,將系統從網狀結構變爲以中介者爲中心的星型結構。

3.UML圖示

UML

Mediator :抽象中介者角色,定義了同事對象到中介者對象的接口。
ConcreteMediator:具體中介者角色,它從具體的同事對象接收消息,向具體同事發出命令。
Colleague:抽象同事角色,定義了中介者對象接口,它只知道中介者而不知道其他同事對象。
ConcreteColleague:具體同事角色,每個具體同事類都知道自己在小範圍內的行爲,而不知道它在大範圍內的目的。

4.中介者模式的簡單實現

中介者模式可以拿武俠來舉例,江湖中門派衆多,門派之前因爲想法不同會有很多的利益衝突,這樣就會帶來無休止的紛爭。爲了江湖的安寧,大家推舉出了一個大家都認可的武林盟主來對江湖紛爭進行調停。
前段時間武當派和峨眉派的的弟子被大力金剛指所殺,大力金剛指是少林派的絕學,因爲事情重大,而且少林派實力強大,武當派和峨眉派不能夠直接去少林派去問罪,只能上報武林盟主由武林盟主出面進行調停,如下圖所示。

在這裏插入圖片描述

  • 抽象中介者角色
    首先我們創建抽象中介者類,在這個例子中,它是一個武林聯盟類,如下所示。
public abstract class WulinAlliance {
 
    abstract void notice(String message,United united );
}

notice方法用於向門派發送通知,其中United爲抽象同事類也就是門派類,接下來我們來創建它。

  • 抽象同事角色
public class United {

    protected WulinAlliance wulinAlliance;

    public United(WulinAlliance wulinAlliance) {
        this.wulinAlliance = wulinAlliance;
    }
}

門派類(抽象同事類)會在構造方法中得到武林聯盟類(抽象中介者類)。

  • 具體同事角色

具體同事類包括武當派、峨眉派和少林派,如下所示。

public class Emei extends United {

    public Emei(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("峨眉收到消息:" + message);
    }
}

public class ShaoLin extends United {

    public ShaoLin(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("少林收到消息:" + message);
    }
}
public class Wudang extends United {

    public Wudang(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("武當收到消息:" + message);
    }
}

武當、峨眉和少林類都有兩個方法,其中getNotice方法是自有方法,對於其他的門派(同事類)和武林聯盟(中介者)沒有依賴,只是用來接收武林盟主的通知。sendAlliance方法則是依賴方法,它必須通過武林盟主才能完成行爲。

  • 具體中介者角色
public class Champions extends WulinAlliance {
    private Wudang wudang;
    private ShaoLin shaolin;
    private Emei emei;
    public void setWudang(Wudang wudang) {
        this.wudang = wudang;
    }
    public void setEmei(Emei emei) {
        this.emei = emei;
    }
    public void setShaolin(ShaoLin shaolin) {
        this.shaolin = shaolin;
    }
    @Override
    public void notice(String message, United united) {
        if (united == wudang) {
            shaolin.getNotice(message);
        } else if (united == emei) {
            shaolin.getNotice(message);
        } else if (united == shaolin) {
            wudang.getNotice(message);
            emei.getNotice(message);
        }
    }
}

武林盟主需要了解所有的門派,所以需要用setter來持有武當、峨眉和少林的引用。notice方法會根據不同門派發來的消息,轉而通知給其他的門派。比如武當發來的消息,武林盟主就會將消息通知給少林。

  • 客戶端調用
public class Clinet {
    public static void main(String[] args) {

        Champions champions=new Champions();
        Wudang wudang=new Wudang(champions);
        ShaoLin shaolin=new ShaoLin(champions);
        Emei emei=new Emei(champions);
        champions.setWudang(wudang);
        champions.setShaolin(shaolin);
        champions.setEmei(emei);

        wudang.sendAlliance("武當弟子被少林大力金剛指所殺");

        emei.sendAlliance("峨眉弟子被少林大力金剛指所殺");

        shaolin.sendAlliance("少林弟子絕不會做出這種事情");

    }
}

首先創建武林盟主類Champions 並傳入到各個門派類,接着調用武林盟主類的setter方法傳入各個門派類,最後調用各個門派的sendAlliance方法通過武林盟主類向其他門派發送消息。

  • 得到如下結果:

在這裏插入圖片描述

參考文獻:
劉望舒的博客
Android源碼設計模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章