一、介绍
1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。
中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
2)中介者模式属于行为型模式,使代码易于维护
3)比如MVC模式,C(Controller控制器)是M (Model模型)和V (View视图)的中介者,在前后端交互时起到了中间人的作用
二、实现
同事类接口
package com.swust.java.行为型模式.中介者模式;
/**
* 同事类接口
*/
public interface Department {
void selfAction(); // 做部门的事情
void outAction(); // 向总经理发出申请
}
/**
* 财务部
*/
class Financial implements Department{
private Mediator m; // 持有中介者的引用
public Financial(Mediator m) {
this.m = m;
m.register("financial",this);
}
@Override
public void selfAction() {
System.out.println("数钱...");
}
@Override
public void outAction() {
System.out.println("汇报工作,钱太多了怎么花");
}
}
/**
* 市场部
*/
class Market implements Department{
private Mediator m; // 持有中介者的引用
public Market(Mediator m) {
this.m = m;
m.register("market",this);
}
@Override
public void selfAction() {
System.out.println("跑去接项目");
}
@Override
public void outAction() {
System.out.println("汇报工作,项目进度 需要资金支持");
m.command("financial");
}
}
/**
* 研发部
*/
class Development implements Department{
private Mediator m; // 持有中介者的引用
public Development(Mediator m) {
this.m = m;
m.register("development",this);
}
@Override
public void selfAction() {
System.out.println("专心科研,开发项目");
}
@Override
public void outAction() {
System.out.println("汇报工作,没钱了啊...");
m
.command(“financial”);
}
}
中介者
package com.swust.java.行为型模式.中介者模式;
import java.util.HashMap;
import java.util.Map;
/**
* 中介
*/
public interface Mediator {
void register(String dName,Department d);
void command(String dName);
}
/**
* 总经理 中介
*/
class President implements Mediator {
private Map<String,Department> departmentMap = new HashMap<>();
@Override
public void register(String dName, Department d) {
departmentMap.put(dName,d);
}
@Override
public void command(String dName) {
Department department = departmentMap.get(dName);
department.selfAction();
}
}
测试类
package com.swust.java.行为型模式.中介者模式;
public class Client {
public static void main(String[] args) {
Mediator m = new President();
Department development = new Development(m);
Department financial = new Financial(m);
Department market = new Market(m);
// 当市场部需要资金时
market.outAction();
}
}
执行结果
汇报工作,项目进度 需要资金支持
数钱...