中介(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