中介這個詞並不陌生,就是房屋中介的那個「中介」,就是中間人的意思。好比MVC模式,C(Controller控制器)是M(Model模型)和V(View視圖)的中介者,在先後端交互時起到了中間人的做用。git
中介者模式(Mediator),用一箇中介對象來封裝一系列的對象交互。中介者使各個對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。UML結構圖以下:後端
其中,Mediator是抽象中介者,定義了同事對象到中介者對象的接口;Colleague是抽象同事類;ConcreteMediator是具體中介者對象,實現抽象類的方法,它須要知道全部具體同事類,並從具體同事接收消息,向具體同事對象發出命令;ConcreteColleague是具體同事類,每一個具體同事只知道本身的行爲,而不瞭解其它同事類的狀況,但它們卻都認識中介者對象。安全
抽象中介者角色定義統一的接口,用於各同事角色之間的通訊。框架
1 public abstract class Mediator { 2 3 //抽象的發送消息方法 4 public abstract void send(String message, Colleague colleague); 5 6 }
每個同事角色都知道中介者角色,並且與其它的同事角色通訊的時候,必定要經過中介者角色協做。每一個同事類的行爲分兩種:一種是同事自己行爲,好比改變對象自己的狀態,處理本身的行爲等,這種行爲叫作自發行爲,與其它同事類或者中介者沒有任何依賴;第二種是必須依賴中介者才能完成的行爲,叫作依賴方法。ide
1 public abstract class Colleague { 2 3 protected Mediator mediator; 4 5 public Colleague(Mediator mediator) { 6 this.mediator = mediator; 7 } 8 9 }
具體中介者角色經過協調各同事角色實現協做行爲,所以它必須依賴於各個同事角色。this
1 public class ConcreteMediator extends Mediator { 2 3 private ConcreteColleague1 colleague1; 4 private ConcreteColleague2 colleague2; 5 6 public void setColleague1(ConcreteColleague1 colleague1) { 7 this.colleague1 = colleague1; 8 } 9 10 public void setColleague2(ConcreteColleague2 colleague2) { 11 this.colleague2 = colleague2; 12 } 13 14 @Override 15 public void send(String message, Colleague colleague) { 16 if(colleague == colleague1) { 17 colleague2.notify(message); 18 } else { 19 colleague1.notify(message); 20 } 21 } 22 23 }
這裏以ConcreteColleague1爲例,ConcreteColleague2再也不贅述。spa
1 public class ConcreteColleague1 extends Colleague { 2 3 public ConcreteColleague1(Mediator mediator) { 4 super(mediator); 5 } 6 7 public void send(String message) { 8 mediator.send(message, this); 9 } 10 11 public void notify(String message) { 12 System.out.println("同事1獲得消息:" + message); 13 } 14 15 }
首先建立一個具體中介者對象,而後實例化兩個具體同事類並與該中介者進行綁定,colleague1與colleague2經過中介者發送信息。code
1 public class Client { 2 3 public static void main(String[] args) { 4 ConcreteMediator mediator = new ConcreteMediator(); 5 6 ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator); 7 ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator); 8 9 mediator.setColleague1(colleague1); 10 mediator.setColleague2(colleague2); 11 12 colleague1.send("Nice to meet u."); 13 colleague2.send("Nice to meet u too."); 14 } 15 16 }
運行結果以下:
對象
上面咱們有提到,聯合國做爲一個由各國表明組成,用來維護國際和平與安全,解決國際間經濟、社會、文化和人道主義性質的問題的角色,它就是一個調停者、中介者的角色,國與國直接徹底徹底能夠經過「聯合國」這個中介者來發生關係,而不用直接通訊。blog
下面就以聯合國安理會做爲中介者,瞭解一下中介者模式。UML圖以下:
抽象中介者。
1 public abstract class UnitedNations { 2 3 public abstract void declare(String message, Country country); 4 5 }
抽象國家類,需聲明中介者角色。
1 public class Country { 2 3 protected UnitedNations unitedNations; 4 5 public Country(UnitedNations unitedNations) { 6 this.unitedNations = unitedNations; 7 } 8 9 }
具體國家類,繼承了抽象國家類。這裏以USA類爲例,Iraq類再也不贅述。
1 public class USA extends Country { 2 3 public USA(UnitedNations unitedNations) { 4 super(unitedNations); 5 } 6 7 public void declare(String message) { 8 unitedNations.declare(message, this); 9 } 10 11 public void getMessage(String message) { 12 System.out.println("美國得到對方信息:" + message); 13 } 14 15 }
具體中介者角色,繼承抽象中介者,重寫其declare()方法,對不一樣國家發送不一樣信息。
1 public class UnitedNationsSecurityCouncil extends UnitedNations { 2 3 private USA usa; 4 private Iraq iraq; 5 6 public void setUsa(USA usa) { 7 this.usa = usa; 8 } 9 10 public void setIraq(Iraq iraq) { 11 this.iraq = iraq; 12 } 13 14 @Override 15 public void declare(String message, Country country) { 16 if(country == usa) { 17 iraq.getMessage(message); 18 } else { 19 usa.getMessage(message); 20 } 21 } 22 23 }
實例化一個聯合國安理會對象,兩國經過聯合國安理會進行對話。
1 public class Client { 2 3 public static void main(String[] args) { 4 5 UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil(); 6 7 USA usa = new USA(UNSC); 8 Iraq iraq = new Iraq(UNSC); 9 10 UNSC.setUsa(usa); 11 UNSC.setIraq(iraq); 12 13 usa.declare("不許研製核武器"); 14 iraq.declare("咱們沒有核武器"); 15 } 16 17 }
運行結果以下: