在结构型设计模式中,有一个外观/门面(Facade)模式,它的作用是降低客户类与子系统内部各类的交互,相当于一个传达室,有客人来时直接与传达室交互,然后由传达室去系统内部为客人办理各种事务,这里中介者也起到类似的作用,但是它是在系统内部各个部门交流的枢纽,也即是说,系统内部不同部门之间就不要直接交互了,有消息传达的话都经过这个中介者帮它们去完成。GOF对Mediator的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们
之间的交互。 下图是中介者模式的结构图:
中介者模式中,各个类的交互关系如下图表示:
也就是说,中介者对象是一组需要相互通信的对象的信息传达人,所有需要与其他对象通信的对象可以将信息传给中介者,然后由中介者帮它传信。根据上图可以得出如下代码:
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都复杂,这可能使得中介者自身成为一个难于维护的庞然大物。