1. 程式人生 > >中介者模式(java實現)

中介者模式(java實現)

中介者模式

世界需要和平

由於各國之間代表的利益不同,所以矛盾衝突是在所難免的,聯合國組織由各國的代表組成,用來維護國際和平與安全,它就是一個調停者,中介者的角色.國與國之間的關係,就如同不同的物件與物件之間的關係,這就要求物件之間需要知道其他所有的物件,儘管將一個系統分割成許多物件通常可以增加其可複用性,但是物件之間相互連線的激增又會降低其可複用性了.這是因為大量的連線使得一個物件不可能在沒有其他物件支援下工作,系統表現為一個不可分割的整體,所以,對系統的行為進行較大的改動就十分困難了.要解決這樣的問題,可以應用’迪米特法則’,即如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用

.如果一個類需要呼叫另一個類的某一個方法的話,可以通過第三者來轉發這個呼叫.在本例中,國與國之間完全可以通過’聯合國’這個中介者來發生關係,而不用直接通訊.之前講解迪米特法則的時候,是以公司IT部門的管理為例的,其實讓我一個剛進公司的人去求任何一個不認識的IT部同事幫忙是有困難的,但如果有IT主管來協調工作,就不至於發生我第一天上班卻沒有電腦進行工作的局面.IT主管就是一個’中介者’物件.

安理會做中介

//聯合國機構

public abstract class UnitedNations {

//得到國家的物件和傳送訊息

public abstract void declare(String message

,Country country);

}

public abstract class Country {

protected UnitedNations mediator;

public Country(UnitedNations mediator) {

this.mediator=mediator;

}

}

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);

}

}

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);

}

}

//聯合國安全理事會,隸屬於聯合國

public class UnitedNationsSecurityCouncil extends UnitedNations {

//聯合國安全理事會了解所有的國家,所以擁有美國和伊拉克的物件屬性

private USA country1;

private Iraq country2;

public void setCountry1(USA country1) {

this.country1 = country1;

}

public void setCountry2(Iraq country2) {

this.country2 = country2;

}

@Override

public void declare(String message, Country country) {

if(country==country1) {

country2.getMessage(message);

}else {

country1.getMessage(message);

}

}

}

public class Demo {

public static void main(String[] args) {

UnitedNationsSecurityCouncil UNSC=new UnitedNationsSecurityCouncil();

USA c1=new USA(UNSC);

Iraq c2=new Iraq(UNSC);

UNSC.setCountry1(c1);

UNSC.setCountry2(c2);

c1.declare("你敢研製核武器,老子滅了你");

c2.declare("不敢不敢,小弟不敢");

}

}

輸出結果:

伊拉克獲得對方資訊:  你敢研製核武器,老子滅了你

美國獲得對方資訊:  不敢不敢,小弟不敢

中介者模式:

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

中介者模式的優點:

國家的改變不會影響到其他國家,而只是與安理會發生變化

由於把物件如何協作進行了抽象,將中介作為一個概念並將其封裝到一個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上,也就是站在一個更巨集觀的角度看待系統.比如巴以衝突,本來只能算是國與國之間的矛盾,因此各自的看法可能都比較狹隘,但是站在聯合國安理會的角度,就可以從全球化,也更客觀地看待這個問題

中介者模式的缺點:

具體中介者類可能因為國家的增多,而變得非常複雜,反而不容易維護了.所以說,中介者模式很容易在系統中應用,也很容易在系統中誤用.當系統出現了’多對多’互動複雜的物件群時,不要急於使用中介者模式,而是要先反思你的系統在設計上是不是合理.

何時使用中介者模式:

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