GOF23設計模式之中介者模式(mediator)

1、中介者模式概述

  若是一個系統中對象之間的聯繫呈現網狀結構,對象之間存在大量多對多的關係,致使關係及其複雜,這時能夠引入一箇中介者對象,使得各個對象只跟中介者對象打交道,從而將複雜的網絡結構化爲星型結構。java

  核心:網絡

    (1)若是一個系統中對象之間的聯繫呈現網狀結構,對象之間存在大量的多對多關係,將致使關係及其複雜,這些對象稱爲「同事對象」;ide

    (2)這時能夠引入一箇中介者對象,使各個同事對象只跟中介只對象打交道,將複雜的網絡結構化解爲星型結構。測試

   

2、中介者模式情景導入

  在一個公司裏邊,有三個部門:財務部、市場部、研發部。假如沒有總經理時,財務部給員工發工資,須要和其餘兩個部門打交道,市場部也要和其餘兩個部門打交道,研發部接收市場部需求,而且須要財務部資金支持,全部也要和其餘兩個部門打交道。雖然只有三個部門,可是關係卻很是混亂。this

  實際上,每一個公司都有總經理,各個部門須要和其餘部門打交道時先通報總經理,總經理再通知各個相關部門,這樣,關係就簡單的多了。spa

  這是一個典型的「中介者模式」,總經理起到中介、協調的做用。code

3、中介者模式示例代碼

 1 /**
 2  * 部門的接口
 3  * @author CL
 4  *
 5  */
 6 public interface Department {
 7     /**
 8      * 本身的工做
 9      */
10     void selfAction();
11     /**
12      * 對外的工做(向總經理髮出申請)
13      */
14     void outAction();
15 }
 1 /**
 2  * 財務部
 3  * @author CL
 4  *
 5  */
 6 public class Financial implements Department {
 7     /**
 8      * 持有中介者(總經理)的引用
 9      */
10     private Mediator m;
11     
12     public Financial(Mediator m) {
13         this.m = m;
14         m.register("財務部", this);
15     }
16 
17     @Override
18     public void selfAction() {
19         System.out.println("財務部本職工做-->作帳!提供資金支持!");
20     }
21 
22     @Override
23     public void outAction() {
24         System.out.println("財務部對外工做-->彙報工做!收賣產品的錢!");
25         m.command("市場部");
26     }
27 
28 }
 1 /**
 2  * 市場部
 3  * @author CL
 4  *
 5  */
 6 public class Market implements Department {
 7     /**
 8      * 持有中介者(總經理)的引用
 9      */
10     private Mediator m;
11     
12     public Market(Mediator m) {
13         this.m = m;
14         m.register("市場部", this);
15     }
16 
17     @Override
18     public void selfAction() {
19         System.out.println("市場部本職工做-->跑業務!賣產品!");
20     }
21 
22     @Override
23     public void outAction() {
24         System.out.println("市場部對外工做-->彙報工做!申請資金支持!");
25         m.command("財務部");
26     }
27 
28 }
 1 /**
 2  * 研發部
 3  * @author CL
 4  *
 5  */
 6 public class Development implements Department {
 7     /**
 8      * 持有中介者(總經理)的引用
 9      */
10     private Mediator m;
11     
12     public Development(Mediator m) {
13         this.m = m;
14         m.register("研發部", this);
15     }
16 
17     @Override
18     public void selfAction() {
19         System.out.println("研發部本職工做-->研發產品!");
20     }
21 
22     @Override
23     public void outAction() {
24         System.out.println("研發部對外工做-->彙報工做!尋找資金支持!");
25         m.command("財務部");
26     }
27 
28 }
 1 /**
 2  * 中介者的接口(總經理)
 3  * @author CL
 4  *
 5  */
 6 public interface Mediator {
 7     /**
 8      * 各部門向總經理備案
 9      * @param dName    部門名稱
10      * @param d    部門
11      */
12     void register(String dName, Department d);
13 
14     /**
15      * 向其餘部門發送任務
16      * @param dName 部門名稱
17      */
18     void command(String dName);
19 }
 1 import java.util.HashMap;
 2 import java.util.Map;
 3 
 4 /**
 5  * 總經理類(中介)
 6  * @author CL
 7  *
 8  */
 9 public class President implements Mediator {
10     private Map<String, Department> map;
11     
12     public President() {
13         map = new HashMap<String, Department>();
14     }
15 
16     @Override
17     public void register(String dName, Department d) {
18         map.put(dName, d);
19     }
20 
21     @Override
22     public void command(String dName) {
23         map.get(dName).selfAction();
24     }
25 
26 }

  測試:對象

 1 /**
 2  * 測試中介者模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         Mediator m = new President();
10         
11         //各部門向總經理備案
12         Market market = new Market(m);
13         Financial financial = new Financial(m);
14         Development development = new Development(m);
15         
16         //市場部
17         market.selfAction();
18         market.outAction();
19         
20         System.out.println("-------------------------------");
21         
22         //財務部
23         financial.outAction();
24         
25         System.out.println("-------------------------------");
26         
27         //研發部
28         development.outAction();
29         
30     }
31 }

  控制檯輸出:blog

市場部本職工做-->跑業務!賣產品!
市場部對外工做-->彙報工做!申請資金支持!
財務部本職工做-->作帳!提供資金支持!
-------------------------------
財務部對外工做-->彙報工做!收賣產品的錢!
市場部本職工做-->跑業務!賣產品!
-------------------------------
研發部對外工做-->彙報工做!尋找資金支持!
財務部本職工做-->作帳!提供資金支持!

4、中介者模式常見開發應用場景

  (1)MVC 模式(其中 C 控制器就是一箇中介者對象,M 和 V 都和 C 打交道);接口

  (2)窗口遊戲遊戲,窗口軟件開發中窗口對象也是一箇中介者對象;

  (3)圖形界面開發 GUI 中,多個組件之間的交互,能夠經過引入一箇中介者對象來解決,能夠是總體的窗口對象或者 DOM對象;

  (4)…………

相關文章
相關標籤/搜索