1. 程式人生 > >大話設計模式之中介者模式總結-java實現

大話設計模式之中介者模式總結-java實現

注:示例來自《大話設計模式》

儘管將一個系統分割成許多物件通常可以增加其可複用性 但是物件間相互連線的激增又會降低其可複用性 因為大量的連線使得一個物件不可能在沒有其他物件的支援下工作 系統表現為一個不可分割的整體 所以 對系統的行為進行任何較大的改動就十分困難了 要解決這樣的問題 可以用中介者模式

下面我們寫一個案例 需求是美國和伊拉克之間的對話都是通過聯合國安理會作為中介來完成 簡單程式碼實現如下

聯合國機構類

package Test25;

//聯合國機構
public abstract class UnitedNations {

    public abstract void
Declare(String message, Country colleague); }

國家類

package Test25;

//國家
public class Country {

    protected UnitedNations mediator;

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

}

美國類

package Test25;

//美國
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); } }

伊拉克類

package Test25;

//伊拉克
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); } }

聯合國安理會類

package Test25;

//聯合國安全理事會
public class UnitedNationsSecurityCouncil extends UnitedNations {

    private USA colleague1;
    private Iraq colleague2;

    public void setColleague1(USA colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(Iraq colleague2) {
        this.colleague2 = colleague2;
    }


    @Override
    public void Declare(String message, Country colleague) {

        if (colleague == colleague1)
        {
            colleague2.GetMessage(message);
        }
        else
        {
            colleague1.GetMessage(message);
        }

    }

}

客戶端程式碼

package Test25;

public class Program {

    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("我們沒有核武器,也不怕侵略。");

    }


}

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

中介者模式很容易在系統中應用 也很容易在系統中誤用 當系統出現了多對多互動複雜的物件群時 不要急於使用中介者模式 而要先反思你的系統在設計上是不是合理

中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合 以及想定製一個分佈在多個類中的行為 而又不想生成太多的子類的場合

優點 Mediator的出現減少了各個Colleague的耦合 使得可以獨立地改變和複用各個Colleague類和Mediator 其次 由於把物件如何協作進行了抽象 將中介作為一個獨立的概念並將其封裝在一個物件中 這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來 也就是站在一個更巨集觀的角度去看待系統

缺點 由於ConcreteMediator控制了集中化 於是就把互動複雜性變為了中介者的複雜性 這就使得中介者會變得比任何一個ConcreteColleague都複雜