大話設計模式筆記(二十二)の中介者模式

中介者模式

定義

用一箇中介對象來封裝一系列的對象交互。中介使各對象之間不須要顯示的相互引用,從而使其耦合鬆散,並且能夠獨立的改變它們之間的交互。安全

UML圖

舉個栗子

「聯合國」就是世界上各個國家的一個「中介」,許多事情都不是國家之間直接交互,而是經過「安理會」等組織進行協商、投票等過程。ide

Talk is cheap, show me the code

(屁話少說,放碼過來)

/**
 * 聯合國機構
 * Created by callmeDevil on 2019/12/15.
 */
public abstract class UnitedNations {
    // 聲明
    public abstract void declare(String message, Country colleague);
}
/**
 * 國家(至關於Colleague類)
 * Created by callmeDevil on 2019/12/15.
 */
public abstract class Country {

    protected UnitedNations mediator;

    public Country(UnitedNations mediator){
        this.mediator = mediator;
    }

}
/**
 * 美國(至關於 ConcreteColleague1 類)
 * Created by callmeDevil on 2019/12/15.
 */
public class USA extends Country{

    public USA(UnitedNations mediator) {
        super(mediator);
    }

    // 聲明
    public void declare(String message){
        mediator.declare(message, this);
    }

    //得到消息
    public void getMessage(String message){
        System.out.println("美國得到對方信息:" + message);
    }

}
/**
 * 伊拉克(至關於 ConcreteColleague2 類)
 * Created by callmeDevil on 2019/12/15.
 */
public class Iraq extends Country{

    public Iraq(UnitedNations mediator) {
        super(mediator);
    }

    // 聲明
    public void declare(String message){
        mediator.declare(message, this);
    }

    //得到消息
    public void getMessage(String message){
        System.out.println("伊拉克得到對方信息:" + message);
    }

}
/**
 * 聯合國安全理事會
 * Created by callmeDevil on 2019/12/15.
 */
public class UnitedNationsSecurityCouncil extends UnitedNations{

    // 美國
    private USA colleague1;
    // 伊拉克
    private Iraq colleague2;

    // 省略 get set

    @Override
    public void declare(String message, Country colleague) {
        // 重寫聲明方法,實現了兩個對象之間的通訊
        if (colleague == colleague1) {
            colleague2.getMessage(message);
        } else {
            colleague1.getMessage(message);
        }
    }
    
}
public class Test {
    public static void main(String[] args) {
        UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();

        USA c1 = new USA(UNSC);
        Iraq c2 = new Iraq(UNSC);

        UNSC.setColleague1(c1);
        UNSC.setColleague2(c2);

        c1.declare("不許研製核武器,不然要發動戰爭!");
        c2.declare("咱們沒有核武器,也不怕侵略!");
    }
}

運行結果this

伊拉克得到對方信息:不許研製核武器,不然要發動戰爭!
美國得到對方信息:咱們沒有核武器,也不怕侵略!

總結

優勢

  • Mediator的出現減小了各個Colleague的耦合,使得能夠獨立的改變和複用各個Colleague類和Mediator
  • 因爲把對象如何協做進行了抽象,將中介做爲一個獨立的概念並將其封裝在一個對象中,這樣關注的對象就從對象各自自己的行爲轉移到它們之間的交互上來,也就是站在一個更宏觀的角度去看待系統

缺點

  • 中介者模式很容易在系統中應用,也容易誤用。當系統出現了‘多對多’交互複雜的對象羣時,不要急於使用中介者模式,而要先反思你的系統在設計上是否是合理的
  • 因爲ConcreteMediator控制了集中化,因而就把交互複雜性變爲中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜

經常使用情景

  • 一組對象以定義良好可是複雜的方式進行交互通訊的場合
  • 須要定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合
相關文章
相關標籤/搜索