1、核心
-如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象”
-我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星形结构
结构图:
2、本质
解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
3、应用场景
-MVC模式(其中的C,控制器就是一个中介者对象。M和C都和他打交道)
-窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
-图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象
-java.lang.reflect.Method#invoke()
4、代码示例
问题:
UML图:
/**
* 部门抽象接口
* @author ly1
*
*/
public interface IDepartment {
void selfAction();
void outAction();
}
/**
* 财务部
* @author ly1
*
*/
public class Financial implements IDepartment{
private IMediator mediator;
public Financial(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("financial", this);
}
@Override
public void selfAction() {
System.out.println("数钱!");
}
@Override
public void outAction() {
mediator.comand("financial");
}
}
/**
* 开发部
* @author ly1
*
*/
public class Development implements IDepartment{
private IMediator mediator;
public Development(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("development", this);
}
@Override
public void selfAction() {
System.out.println("项目开发中!");
}
@Override
public void outAction() {
mediator.comand("financial");
}
}
/**
* 研发部
* @author ly1
*
*/
public class Research implements IDepartment{
private IMediator mediator;
public Research(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("research", this);
}
@Override
public void selfAction() {
System.out.println("研究中!");
}
@Override
public void outAction() {
mediator.comand("financial");
}
}
/**
* 中介抽象接口
* @author ly1
*
*/
public interface IMediator {
void comand(String comand);
void register(String name,IDepartment department);
}
import java.util.HashMap;
import java.util.Map;
/**
* 具体中介类:总经理
* @author ly1
*
*/
public class President implements IMediator{
private Map<String,IDepartment> list = new HashMap<String,IDepartment>();
@Override
public void comand(String comand) {
list.get(comand).selfAction();
}
@Override
public void register(String name, IDepartment department) {
list.put(name, department);
}
}
/**
* 客户端调用
* @author ly1
*
*/
public class Client {
public static void main(String[] args) {
IMediator mediator = new President();
IDepartment f = new Financial(mediator);
IDepartment d = new Development(mediator);
IDepartment r = new Research(mediator);
d.selfAction();
d.outAction();
}
}
结果:
项目开发中!
数钱!