設計模式之中介者模式

aoho發表於2019-01-03

中介者模式屬於行為型模式。

中介者模式的定義

定義:用一箇中介者物件來封裝一系列的物件互動。中介者使得各物件不需要顯式地相互引用,從而使其鬆散耦合,而且可以獨立地改變它們之間的互動。

mediator
中介者模式

在軟體開發中,通過提供一個統一的介面讓系統不同部分進行通訊。一般,如果系統有很多子模組需要直接溝通,都要建立一箇中央控制點讓其各模組通過中央控制點進行互動。中介者模式可以讓這些子模組不需要直接溝通,從而達到進行解耦的目的。在現實生活中,有很多中介者模式的身影,例如二手車平臺、婚姻中介和房產中介,通過平臺方介入進行協調供需之間的關係。

中介者模式的結構

中介者模式有如下角色:

  • Mediator
    中介者定義一個介面用於與各同事(Colleague)物件通訊。
  • ConcreteMediator
    具體中介者通過協調各同事物件實現協作行為,瞭解並維護它的各個同事。
  • Colleague
    抽象同事類。
  • Colleagueclass
    具體同事類。每個具體同事類都只需要知道自己的行為即可,但是他們都需要認識中介者

中介者模式的實現

定義抽象Mediator:

public abstract class Mediator {
	public abstract void notice(String content,Colleague coll);
}
複製程式碼

定義抽象同事Colleague:

public abstract class Colleague {
    protected String name;
    protected Mediator mediator;

    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}
複製程式碼

具體同事類繼承自Colleague,此刻就可以與中介者mediator進行通訊了。

public class ColleagueA extends Colleague {
    public ColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }
    public void getNotice(String message){
        System.out.println("同事A"+name+"獲得資訊"+message);
    }
    //同事A與中介者通訊
    public void contact(String message){
        mediator.notice(message, this);
    }
}
複製程式碼
public class ColleagueB extends Colleague {

    public ColleagueB(String name, Mediator mediator) {
        super(name, mediator);
    }
    public void getNotice(String message){
        System.out.println("同事B"+name+"獲得資訊"+message);
    }
    //同事B與中介者通訊
    public void contact(String message){
        mediator.notice(message, this);
    }
}
複製程式碼

定義具體中介者ConcreteMediator,具體中介者通過協調各同事物件實現協作行為,瞭解並維護它的各個同事。

@Data
public class ConcreteMediator extends Mediator {
    ColleagueA collA;
    ColleagueB collB;

    @Override
    public void notice(String content, Colleague coll) {
        if (coll == collA) {
            collB.getNotice(content);
        } else {
            collA.getNotice(content);
        }
    }
}
複製程式碼

定義中介者與具體同事類,中介者知曉每一個具體的Colleague類。

public class Client {
    // 中介者,ColleagueA、ColleagueB
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ColleagueA colleagueA = new ColleagueA("A", mediator);
        ColleagueB colleagueB = new ColleagueB("B", mediator);
        mediator.setCollA(colleagueA);
        mediator.setCollB(colleagueB);
        colleagueA.contact("我是A,我要聯絡B!");
        colleagueB.contact("我是B,收到A訊息!");
    }
}
複製程式碼

執行結果很簡單,讀者自己試一下吧。

總結

中介者模式簡化了物件之間的關係,將系統的各個物件之間的相互關係進行封裝,將各個同事類解耦,使得系統變為鬆耦合。並且提供系統的靈活性,使得各個同事物件獨立而易於複用。

其缺點也很明顯:

  • 中介者模式中,中介者角色承擔了較多的責任,所以一旦這個中介者物件出現了問題,整個系統將會受到重大的影響。
  • 新增加一個同事類時,不得不去修改抽象中介者類和具體中介者類,此時可以使用觀察者模式和狀態模式來解決這個問題。

中介者模式適用於當物件之間的互動變多時,為了防止一個類會涉及修改其他類的行為,可以使用中介者模式,將系統從網狀結構變為以中介者為中心的星型結構。

vs 外觀模式

外觀模式主要是以封裝和隔離為主要任務,中介者則是協調同事類之間的關係,因此,中介者具有部分業務的邏輯控制。他們之間的主要區別為:

  • 外觀模式的子系統如果脫離外觀模式還是可以執行的,而中介者模式增加了業務邏輯,同事類不能脫離中介者而獨自存在。
  • 外觀模式將子系統的邏輯隱藏,使用者不知道子系統的存在,而中介者模式中,使用者知道同事類的存在。

訂閱最新文章,歡迎關注我的公眾號

微信公眾號

參考

  1. 設計模式(十四)中介者模式
  2. Java設計模式系列之中介者模式

相關文章