Observer模式通过尽可能缩小一个对象应对其他对象承担的责任范围来支持这种责任分配。而Singleton模式将责任集中于其他对象都可以访问和复用的某个特定对象中。与Singleton模式类似的是,Mediator模式也对责任进行了集中,不过这种模式只是对某个特定对象集合的责任进行集中,而不是对整个系统的其他所有对象的责任进行集中。
Mediator模式的意图是定义一个对象,该对象将对象集合之间的交互封装起来。 利用该模式可以降低对象之间的耦合程度,避免对象之间的显式引用,还可以让对象间的交互独立变化。
在一个独立的对象中集中管理对象交互行为还会带来另外一个好处,那就是简化和标准化对象间的交互规则。
Mediator模式广泛应用于GUI应用程序的开发过程,借助该模式,可以不必直接管理组件之间错综复杂的交互。在构造GUI时,Java会引导我们使用Mediator模式,但它并不要求我们一定要把中介逻辑移出应用程序类。不过,这样做可以简化我们的代码。中介者类可专门用于处理对象间的交互,而应用程序类专门负责创建组件。
Mediator模式的意图是定义一个对象,该对象将对象集合之间的交互封装起来。 利用该模式可以降低对象之间的耦合程度,避免对象之间的显式引用,还可以让对象间的交互独立变化。
Mediator模式主要适用的几种情况:
-
一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
-
一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
-
想定制一个分布在多个类中的行为,而又不想生成太多的子类。
看一个Mediator模式的典型示例类图:
具体实现:
Mediator 中介者定义一个接口用于与各同事(Colleague)对象通信。
public abstract class Mediator {
public abstract void notice(String content);
}
ConcreteMediator 具体中介者通过协调各同事对象实现协作行为。 了解并维护它的各个同事。
public class ConcreteMediator extends Mediator {
private ColleagueA ca;
private ColleagueB cb;
public ConcreteMediator() {
ca = new ColleagueA();
cb = new ColleagueB();
}
public void notice(String content) {
if (content.equals("boss")) {
//老板来了, 通知员工A
ca.action();
}
if (content.equals("client")) {
//客户来了, 通知前台B
cb.action();
}
}
}
Colleagueclass 每一个同事类都知道它的中介者对象。 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信
public class ColleagueA extends Colleague {
public void action() {
System.out.println("普通员工努力工作");
}
}
public class ColleagueB extends Colleague {
public void action() {
System.out.println("前台注意了!");
}
}
public class Test {
public static void main(String[] args) {
Mediator med = new ConcreteMediator();
//老板来了
med.notice("boss");
//客户来了
med.notice("client");
}
}
运行结果:
在一个独立的对象中集中管理对象交互行为还会带来另外一个好处,那就是简化和标准化对象间的交互规则。
Mediator模式广泛应用于GUI应用程序的开发过程,借助该模式,可以不必直接管理组件之间错综复杂的交互。在构造GUI时,Java会引导我们使用Mediator模式,但它并不要求我们一定要把中介逻辑移出应用程序类。不过,这样做可以简化我们的代码。中介者类可专门用于处理对象间的交互,而应用程序类专门负责创建组件。