若是一個系統中對象之間的聯繫呈現網狀結構,對象之間存在大量多對多的關係,致使關係及其複雜,這時能夠引入一箇中介者對象,使得各個對象只跟中介者對象打交道,從而將複雜的網絡結構化爲星型結構。java
核心:網絡
(1)若是一個系統中對象之間的聯繫呈現網狀結構,對象之間存在大量的多對多關係,將致使關係及其複雜,這些對象稱爲「同事對象」;ide
(2)這時能夠引入一箇中介者對象,使各個同事對象只跟中介只對象打交道,將複雜的網絡結構化解爲星型結構。測試
在一個公司裏邊,有三個部門:財務部、市場部、研發部。假如沒有總經理時,財務部給員工發工資,須要和其餘兩個部門打交道,市場部也要和其餘兩個部門打交道,研發部接收市場部需求,而且須要財務部資金支持,全部也要和其餘兩個部門打交道。雖然只有三個部門,可是關係卻很是混亂。this
實際上,每一個公司都有總經理,各個部門須要和其餘部門打交道時先通報總經理,總經理再通知各個相關部門,這樣,關係就簡單的多了。spa
這是一個典型的「中介者模式」,總經理起到中介、協調的做用。code
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
市場部本職工做-->跑業務!賣產品! 市場部對外工做-->彙報工做!申請資金支持! 財務部本職工做-->作帳!提供資金支持! ------------------------------- 財務部對外工做-->彙報工做!收賣產品的錢! 市場部本職工做-->跑業務!賣產品! ------------------------------- 研發部對外工做-->彙報工做!尋找資金支持! 財務部本職工做-->作帳!提供資金支持!
(1)MVC 模式(其中 C 控制器就是一箇中介者對象,M 和 V 都和 C 打交道);接口
(2)窗口遊戲遊戲,窗口軟件開發中窗口對象也是一箇中介者對象;
(3)圖形界面開發 GUI 中,多個組件之間的交互,能夠經過引入一箇中介者對象來解決,能夠是總體的窗口對象或者 DOM對象;
(4)…………