1. 程式人生 > >設計模式之---中介者模式(Mediator Design Pattern)

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

場景
買房租房找中介,男女相親找中介。
用一箇中介物件來封裝一系列的物件互動。
中介者使各物件不需要顯式地相互引用,從而使其韌合鬆散,而且可以獨立地改變它們之間的互動。
簡單點來說,將原來兩個直接引用或者依賴的物件拆開,在中間加人一個‘中介’物件,使得兩頭的物件分別和‘中介’,物件引用或者依賴。

意圖
1、使用一箇中介的物件,封裝一組物件之間的互動,這樣這些物件就可以不用彼此耦合。
2、這個中介者常常起著中間橋樑的作用,使其他的物件可以利用中介者完成某些行為活動,因此它必須對所有的參與活動的物件瞭如指掌!

組成部分
1、抽象中介者角色:抽象中介者角色定義統一的介面用於各同事角色之間的通訊。
2、具體中介者角色:具體中介者角色通過協調各同事角色實現協作行為。為此它要知道並引用各個同事角色。
3、同事角色:每一個同事角色都知道對應的具體中介者角色.而且與其他的同事角色通訊的時候,一定要通過中介者角色協作。

應用場景

1、一組物件以定義良好但是複雜的方式進行通訊,產生了混亂的依賴關係,也導致物件難以複用。
2、中介者模式很容易在系統中應用,也很容易在系統中誤用。
3、當系統出現了‘多對多’互動複雜的物件群,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。

應用例項
1.男女相親約會:
1.明確,男人和女人如果約會,假設男方提出約會(女方提出過程類似).如果沒有媒人,該過程如下:
a)男方如果想和女方約會,男方
b)首先請示自己的父母(^_^,假設是封建家庭哦…),
c)然後通知女方
d)女方需要請示女方父母.是否同意約會.

弊端:
需要男方交換的物件太多,
且關係複雜,
當隨著男女之間的交往的複雜,
會涉及到更多複雜的交換,
雙方父母的交換也很更復雜,
使得四個物件(男,女,男方家長,女方家長)關係複雜.
難以控制.

2.模式改進:
採取媒人做“中介者“模式,將變得簡單:
其中無論那一個人有什麼要求,請求,
只需要告訴“媒人“,
至於該請求需要告訴誰,
和誰交換,
只有媒人知道。

1. 男方類

public class Man {
    private Matchmaker mat; // 媒人

    public Man(Matchmaker mat) {
        this.mat = mat;
        mat.registeMan(this);//把自己在媒人那裡註冊(宣告)
    }

    public static void main(String[] args) {
    }

    /**
     * 考慮是否同意
     *
     * @return
*/
public boolean thinking(String says) { System.out.println("男人考慮:我該不該同意呢???"); if (says.length() > 5) { System.out.println("我同意了"); return true; } else { System.out.println("我不同意."); return false; } } /** * 提出約會 * 男人提出約會,只需要告訴媒人,由媒人負責跟其他人互動. * * @param says */ public void tryst(String says) { System.out.println("男人提出約會請求,說:" + says); mat.doManTryst(says); } }

2. 男方家長類


public class ManParent {
    private Matchmaker mat; //媒人類

    public ManParent(Matchmaker mat) {
        this.mat = mat;
        mat.registeManParent(this); //把自己在媒人那裡註冊(宣告)
    }

    public static void main(String[] args) {
        //ManParent manParent1 = new ManParent();
    }

    /**
     * 考慮是否同意
     *
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("男方父母考慮:我們做父母的該不該同意呢???");
        if (says.length() > 5) {
            System.out.println("我們做父母的同意了");
            return true;
        } else {
            System.out.println("我們做父母的不同意.");
            return false;
        }

    }
}

3.女方類

public class Woman {
    private Matchmaker mat; // 媒人

    public Woman(Matchmaker mat) {
        this.mat = mat;
        mat.registeWoman(this); //把自己在媒人那裡註冊(宣告)
    }

    public static void main(String[] args) {

    }

    /**
     * 考慮是否同意
     *
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("女人考慮:我該不該同意呢???");
        if (says.length() > 5) {
            System.out.println("我同意了");
            return true;
        } else {
            System.out.println("我不同意.");
            return false;
        }

    }

    /**
     * 提出約會
     * 女人提出約會,只需要告訴媒人,由媒人負責跟其他人互動.
     *
     * @param says
     */
    public void tryst(String says) {
        System.out.println("女人提出約會請求,說:" + says);
        mat.doWomanTryst(says);
    }
}

4.女方家長類

public class WomanParent {
    private Matchmaker mat; //媒人類
    public WomanParent(Matchmaker mat) {
        this.mat=mat;
        mat.registerWomanParent(this); //把自己在媒人那裡註冊(宣告)
    }
    public static void main(String[] args) {
        //WomanParent womanParent1 = new WomanParent();
    }

    /**
     *考慮是否同意
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("女方父母考慮:我們做父母的該不該同意呢???");
        if (says.length() > 5){
            System.out.println("我們做父母的同意了");
            return true;
        }
        else{
            System.out.println("我們做父母的不同意.");
            return false;
        }
    }
}

5.測試類

public class MatchmakerDemo {
    public MatchmakerDemo() {
    }
    public static void main(String[] args) {
        MatchmakerDemo matchmakerDemo1 = new MatchmakerDemo();
        Matchmaker mat = new Matchmaker(); //媒人出現
        Man man = new Man(mat);//男人,以媒人為建立構造引數
        Woman woman=new Woman(mat);
        ManParent manp=new ManParent(mat);
        WomanParent womanp=new WomanParent(mat);        
        System.out.println("===========================");                                             
        man.tryst("我想和你約會,可以嗎?");
        System.out.println("===========================");
        woman.tryst("想和你約會");
    }
}

輸出結果如下:

===========================
男人提出約會請求,說:我想和你約會,可以嗎?
媒人開始處理約會問題開始
女人考慮:我該不該同意呢???
我同意了
男方父母考慮:我們做父母的該不該同意呢???
我們做父母的同意了
女方父母考慮:我們做父母的該不該同意呢???
我們做父母的同意了
媒人處理約會問題結束,根據同意的結果做其他處理
===========================
女人提出約會請求,說:想和你約會
媒人開始處理約會問題開始
男人考慮:我該不該同意呢???
我不同意.
男方父母考慮:我們做父母的該不該同意呢???
我們做父母的不同意.
女方父母考慮:我們做父母的該不該同意呢???
我們做父母的不同意.
媒人處理約會問題結束,根據同意的結果做其他處理