Java 设计模式系列(十七)中介者模式
Java 设计模式系列(十七)中介者模式
用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互
一、中介者模式结构
-
Mediator
: 中介者接口。在里面定义各个同事之间交互需要的方法,可以是公共的通讯方法,比如changed方法,大家都用,也可以是小范围的交互方法。 -
ConcreteMediator
: 具体中介者实现对象。它需要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。 -
Colleague
: 同事类的定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如:每个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,就可以定义到这个类里面。 -
ConcreteColleague
: 具体的同事类,实现自己的业务,在需要与其它同事通讯的时候,就与持有的中介者通信,中介者会负责与其它的同事交互。
源代码
(1) Colleague
/**
* 同事类的抽象父类
*/
public abstract class Colleague {
/** 持有中介者对象,每一个同事类都知道它的中介者对象 */
private Mediator mediator;
/** 构造方法,传入中介者对象 */
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/** 获取当前同事类对应的中介者对象
public Mediator getMediator() {
return mediator;
}
}
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
/** 示意方法,执行某些业务功能 */
public void someOperation() {
//在需要跟其它同事通信的时候,通知中介者对象
getMediator().changed(this);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
/** 示意方法,执行某些业务功能 */
public void someOperation() {
//在需要跟其它同事通信的时候,通知中介者对象
getMediator().changed(this);
}
}
(2) Mediator
/**
* 中介者,定义各个同事对象通信的接口
*/
public interface Mediator {
/**
* 同事对象在自身改变的时候来通知中介者的方法,
* 让中介者去负责相应的与其它同事对象的交互
* @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态
*/
public void changed(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
/** 持有并维护同事A */
private ConcreteColleagueA colleagueA;
/** 持有并维护同事B */
private ConcreteColleagueB colleagueB;
/** 设置中介者需要了解并维护的同事A对象 */
public void setConcreteColleagueA(ConcreteColleagueA colleague) {
colleagueA = colleague;
}
/** 设置中介者需要了解并维护的同事B对象 */
public void setConcreteColleagueB(ConcreteColleagueB colleague) {
colleagueB = colleague;
}
public void changed(Colleague colleague) {
//某个同事类发生了变化,通常需要与其它同事交互
//具体协调相应的同事对象来实现协作行为
}
}
二、总结
(1) 中介者模式的本质
解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
(2) 中介者模式的应用
- MVC 模式(其中的 C,控制器就是一个中介者对象。M 和 V 都和他打交道)
每天用心记录一点点。内容也许不重要,但习惯很重要!