中介(Mediator)模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用性:- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
为何使用Mediator?
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性.
结构图:
一个简单的例子:
抽象中介类:
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