簡說設計模式——中介者模式

1、什麼是中介者模式

  中介這個詞並不陌生,就是房屋中介的那個「中介」,就是中間人的意思。好比MVC模式,C(Controller控制器)是M(Model模型)和V(View視圖)的中介者,在先後端交互時起到了中間人的做用。git

  中介者模式(Mediator),用一箇中介對象來封裝一系列的對象交互。中介者使各個對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。UML結構圖以下:後端

  其中,Mediator是抽象中介者,定義了同事對象到中介者對象的接口;Colleague是抽象同事類;ConcreteMediator是具體中介者對象,實現抽象類的方法,它須要知道全部具體同事類,並從具體同事接收消息,向具體同事對象發出命令;ConcreteColleague是具體同事類,每一個具體同事只知道本身的行爲,而不瞭解其它同事類的狀況,但它們卻都認識中介者對象。安全

  1. 抽象中介者

  抽象中介者角色定義統一的接口,用於各同事角色之間的通訊。框架

1 public abstract class Mediator {
2     
3     //抽象的發送消息方法
4     public abstract void send(String message, Colleague colleague);
5     
6 }

  2. 抽象同事類

  每個同事角色都知道中介者角色,並且與其它的同事角色通訊的時候,必定要經過中介者角色協做。每一個同事類的行爲分兩種:一種是同事自己行爲,好比改變對象自己的狀態,處理本身的行爲等,這種行爲叫作自發行爲,與其它同事類或者中介者沒有任何依賴;第二種是必須依賴中介者才能完成的行爲,叫作依賴方法。ide

1 public abstract class Colleague {
2     
3     protected Mediator mediator;
4     
5     public Colleague(Mediator mediator) {
6         this.mediator = mediator;
7     }
8 
9 }

  3. 具體中介者類

  具體中介者角色經過協調各同事角色實現協做行爲,所以它必須依賴於各個同事角色。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 }

  4. 具體同事類

  這裏以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 }

  5. Client客戶端

  首先建立一個具體中介者對象,而後實例化兩個具體同事類並與該中介者進行綁定,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 }

  運行結果以下:
  對象

2、中介者模式的應用

  1. 什麼時候使用

  • 多個類相互耦合,造成網狀結構時

  2. 方法

  • 將網狀結構分離爲星型結構

  3. 優勢

  • 減小類間依賴,下降了耦合
  • 符合迪米特原則

  4. 缺點

  • 中介者會膨脹的很大,並且邏輯複雜

  5. 使用場景

  • 系統中對象之間存在比較複雜的引用關係
  • 想經過一箇中間類來封裝多個類的行爲,而又不想生成太多的子類

  6. 應用實例

  • 聯合國/WTO做爲中介者協調各個國家
  • 房屋中介/機場調度系統
  • MVC框架,其中C(Contorller控制器)是M(Model模型)和V(View視圖)的中介者

  7. 注意事項

  • 不該當在職責混亂時使用

3、中介者模式的實現

  上面咱們有提到,聯合國做爲一個由各國表明組成,用來維護國際和平與安全,解決國際間經濟、社會、文化和人道主義性質的問題的角色,它就是一個調停者、中介者的角色,國與國直接徹底徹底能夠經過「聯合國」這個中介者來發生關係,而不用直接通訊。blog

  下面就以聯合國安理會做爲中介者,瞭解一下中介者模式。UML圖以下:

  1. 聯合國機構

  抽象中介者。

1 public abstract class UnitedNations {
2     
3     public abstract void declare(String message, Country country);
4 
5 }

  2. 國家類

  抽象國家類,需聲明中介者角色。

1 public class Country {
2     
3     protected UnitedNations unitedNations;
4     
5     public Country(UnitedNations unitedNations) {
6         this.unitedNations = unitedNations;
7     }
8 
9 }

  3. 具體國家類

  具體國家類,繼承了抽象國家類。這裏以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 }

  4. 聯合國安理會

  具體中介者角色,繼承抽象中介者,重寫其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 }

  5. Client客戶端

  實例化一個聯合國安理會對象,兩國經過聯合國安理會進行對話。

 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 }

  運行結果以下:

  

 

  源碼地址:https://gitee.com/adamjiangwh/GoF 

相關文章
相關標籤/搜索