中介(Mediator)模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用性:
  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

为何使用Mediator?

        各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性.


结构图:Mediator.bmp
一个简单的例子:
抽象中介类:

package Mediator;

public abstract class Mediator{
    
//将一个Colleague注册到中介类
    public abstract void register(Colleague c,String type);
    
//改变Colleague的状态
    public abstract void change(String type);
}

具体中介类:

package Mediator;

public class ConcreteMediator extends Mediator{
    
    
private ColleagueA ca;
    
private ColleagueB cb;
    
    
    
public ConcreteMediator(){}
    
//具体实现方法
    public void register(Colleague c,String type){
        
if(type.equals("A"))
            ca
=(ColleagueA)c;
        
else if(type.equals("B"))
            cb
=(ColleagueB)c;       
    }

    
    
public void change(String type){
        
if(type.equals("A"))
             cb.action();
        
else if(type.equals("B"))
            ca.action();
    }

}

抽象同事类:

package Mediator;

public abstract class Colleague{
    
public abstract void change();
    
public abstract void action();
}

同事A

package Mediator;

public class ColleagueA extends Colleague{
    
private final String type="A";
    
private Mediator m;
    
public ColleagueA(Mediator mediator){
        m
=mediator;
        m.register(
this,type);
    }

    
    
public void change(){
        System.out.println(
"A is changed");
        m.change(type);
    }

    
    
public void action(){
        System.out.println(
"A is changed by mediator");
    }

}

同事B

package Mediator;

public class ColleagueB extends Colleague{
    
private final String type="B";
    
private Mediator m;
    
public ColleagueB(Mediator mediator){
        m
=mediator;
        m.register(
this,type);
    }

    
    
public void change(){
        System.out.println(
"B is changed");
        m.change(type);
    }

    
    
public void action(){
        System.out.println(
"B is changed by mediator");
    }

}

客户端:

package Mediator ;
public class Client{
    
    
private static Mediator mediator=new ConcreteMediator();
    
private static Colleague ca=new ColleagueA(mediator);
    
private static Colleague cb=new ColleagueB(mediator);
    
public static void main(String[] args){
        mediator.change(
"A");
        mediator.change(
"B");
    }
 
}




参考资料:《设计模式速查手册》
http://blog.csdn.net/qutr/archive/2006/07/27/987362.aspx
http://www.jdon.com/designpatterns/mediator.htm