- 定义
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
- 主要角色
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
- 结构图
3-1Q1161I532V0.gif- 开发中的场景
MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交道) – 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
- 实例:部门间的协调:经理
财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。 虽然只有三个部门,但是关系非常乱。实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门。
- 定义中介者接口
public interface Mediator {
/**
* 注册 同事
* @param dname
* @param d
*/
void register(String dname,Department d);
/**
* 执行 处理
* @param dname
*/
void command(String dname);
}
- 中介者实现类
public class President implements Mediator {
private Map<String,Department> map = new HashMap<String , Department>();
@Override
public void command(String dname) {
map.get(dname).selfAction();
}
@Override
public void register(String dname, Department d) {
map.put(dname, d);
}
}
- 定义同事接口
市场部
public class Market implements Department {
private Mediator m; //持有中介者(总经理)的引用
public Market(Mediator m) {
super();
this.m = m;
m.register("market", this);
}
@Override
public void outAction() {
System.out.println("汇报工作!项目承接的进度,需要资金支持!");
m.command("finacial");
}
@Override
public void selfAction() {
System.out.println("跑去接项目!");
}
}
财务部
public class Financial implements Department {
private Mediator m; //持有中介者(总经理)的引用
public Financial(Mediator m) {
super();
this.m = m;
m.register("finacial", this);
}
@Override
public void outAction() {
System.out.println("汇报工作!没钱了,钱太多了!怎么花?");
}
@Override
public void selfAction() {
System.out.println("数钱!");
}
}
开发部
public class Development implements Department {
private Mediator m; //持有中介者(总经理)的引用
public Development(Mediator m) {
super();
this.m = m;
m.register("development", this);
}
@Override
public void outAction() {
System.out.println("汇报工作!没钱了,需要资金支持!");
}
@Override
public void selfAction() {
System.out.println("专心科研,开发项目!");
}
}
调用
public class Client {
public static void main(String[] args) {
// 获取中介者对象
Mediator m = new President();
// 获取同事对象,实例化的时候会在中介者对象中注册
Market market = new Market(m);
Development devp = new Development(m);
Financial f = new Financial(m);
//后面就可以用m来实施指挥调动了
}
}
网友评论