天天看點

設計模式-中介者模式(Mediator Pattern)

推薦:​​Java設計模式彙總​​

中介者模式

定義

中介者模式又稱為調停者模式,用一個中介者來封裝一系列的對象互動,中介者使各對象不需要顯式地互相引用,減少類之間的依賴,進而使其耦合松散,而且可以獨立地改變它們之間的互動。

類型

行為型。

例子

慕課網的每門實戰課程都有相應的交流群,裡面有很多學員,學員可以在裡面讨論問題,這個交流群其實就是一個中介者,是所有學員互相交流的一個中介者,我們先不考慮所有學員都能收到交流群更新的消息,我們現在隻關心交流群作為中介者可以讓所有學員互相交流,每個學員通過交流群就可以和其他所有學員進行交流,這就将多對多的關系轉化成了一對多的關系。

StudyGroup類(中介者),相當于交流群。

package com.kaven.design.pattern.behavioral.mediator;

import java.util.Date;

public class StudyGroup{
    public static void showMessage(User user , String message){
        System.out.println(new Date().toString() + " ["+user.getName()+"]:"+message);
    }
}      

User類(同僚),相當于學員。

package com.kaven.design.pattern.behavioral.mediator;

public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(String name) {
        this.name = name;
    }

    public void sendMessage(String message){
        StudyGroup.showMessage(this,message);
    }
}      

應用層代碼:

package com.kaven.design.pattern.behavioral.mediator;

public class Test {
    public static void main(String[] args) {
        User kaven = new User("kaven");
        User yy = new User("yy");

        kaven.sendMessage("Hey! yy! Let's learn Design Pattern");
        yy.sendMessage("OK! kaven");
    }
}      

輸出:

Thu Jan 30 23:03:48 CST 2020 [kaven]:Hey! yy! Let's learn Design Pattern
Thu Jan 30 23:03:48 CST 2020 [yy]:OK! kaven      

這裡便完成了一個簡單的中介者模式例子。

适用場景

  • 系統中對象之間存在複雜的引用關系,系統結構混亂且難以了解。
  • 一個對象由于引用了其他很多對象并且直接和這些對象通信,導緻難以複用該對象。
  • 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。可以通過引入中介者類來實作,在中介者中定義對象互動的公共行為,如果需要改變行為則可以增加新的具體中介者類。

優點

  • 中介者模式簡化了對象之間的互動,它用中介者和同僚的一對多互動代替了原來同僚之間的多對多互動,一對多關系更容易了解、維護和擴充,将原本難以了解的網狀結構轉換成相對簡單的星型結構。
  • 中介者模式可将各同僚對象解耦。中介者有利于各同僚之間的松耦合,我們可以獨立的改變和複用每一個同僚和中介者,增加新的中介者和新的同僚類都比較友善,更好地符合“開閉原則”。
  • 可以減少子類生成,中介者将原本分布于多個對象間的行為集中在一起,改變這些行為隻需生成新的中介者子類即可,這使各個同僚類可被重用,無須對同僚類進行擴充。
  • 在具體中介者類中包含了大量同僚之間的互動細節,可能會導緻具體中介者類非常複雜,使得系統難以維護。(也就是把具體同僚類之間的互動複雜性集中到了中介者類中,結果中介者成了最複雜的類)。

繼續閱讀