在结构型设计模式中,有一个外观/门面(Facade)模式,它的作用是降低客户类与子系统内部各类的交互,相当于一个传达室,有客人来时直接与传达室交互,然后由传达室去系统内部为客人办理各种事务,这里中介者也起到类似的作用,但是它是在系统内部各个部门交流的枢纽,也即是说,系统内部不同部门之间就不要直接交互了,有消息传达的话都经过这个中介者帮它们去完成。GOF对Mediator的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们

之间的交互。 下图是中介者模式的结构图:

ios中介者模式 中介者是什么意思_中介者模式

中介者模式中,各个类的交互关系如下图表示:

ios中介者模式 中介者是什么意思_中介者模式_02

也就是说,中介者对象是一组需要相互通信的对象的信息传达人,所有需要与其他对象通信的对象可以将信息传给中介者,然后由中介者帮它传信。根据上图可以得出如下代码:

ios中介者模式 中介者是什么意思_中介者_03

ios中介者模式 中介者是什么意思_中介者_04

1 abstract class Colleague{
 2     private Mediator mediator;
 3     public Colleague(Mediator m){
 4         mediator=m;
 5     }
 6     public Mediator getMediator(){
 7         return mediator;
 8     }
 9     public abstract void action();
10     public void change(){
11         mediator.colleagueChanged(this);
12     }
13 }    
14 class Colleague1 extends Colleague{
15     public Colleague1(Mediator m){
16         super(m);
17     }
18     public void action(){
19         System.out.println("this is Colleague1::action()");
20     }
21     public String toString(){
22         return "colleague1";
23     }
24 }
25 class Colleague2 extends Colleague{
26     public Colleague2(Mediator m){
27         super(m);
28     }
29     public void action(){
30         System.out.println("this is Colleague2::action()");
31     }
32     public String toString(){
33         return "colleague2";
34     }
35 }    
36 abstract class Mediator{
37     public abstract void colleagueChanged(Colleague c);
38     protected abstract void createConcreteColleague();
39 }
40 class ConcreteMediator extends Mediator{
41     private Colleague1 colleague1;
42     private Colleague2 colleague2;
43     public void colleagueChanged(Colleague c){
44         System.out.println("发生改变的对象是:"+c);
45         c.action();
46         if(c==colleague1){
47             System.out.println("这里可以通知其他colleague执行相关任务,而不需要 "+c+" 本身去做通知");
48             System.out.println("例如,通知colleague2做一些事情");
49             colleague2.action();
50         }
51     }
52     protected void createConcreteColleague(){
53         colleague1=new Colleague1(this);
54         colleague2=new Colleague2(this);
55     }
56     public Colleague1 getColleague1(){
57         return colleague1;
58     }
59     public Colleague2 getColleague2(){
60         return colleague2;
61     }
62 }
63     
64 public class Test{
65     public static void main(String[] args) {
66         ConcreteMediator cm=new ConcreteMediator();
67         cm.createConcreteColleague();
68         Colleague1 c1=cm.getColleague1();
69         Colleague2 c2=cm.getColleague2();
70         cm.colleagueChanged(c1);
71     }
72 }

View Code

中介者模式的优点是:

1) 减少了子类生成Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Mediator的子类即可。这样各个 Colleague类可被重用。

2) 它将各Colleague解耦 Mediator有利于各Colleague间的松耦合. 你可以独立的改变和复用各Colleague类和Mediator类。

显著的缺点是:

它使控制集中化 中介者模式将交互的复杂性变为中介者的复杂性。 它比任何一个Colleague都复杂,这可能使得中介者自身成为一个难于维护的庞然大物。