模式概述
让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。
使用场景
1.当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
2.当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
3.如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。
代码样例
代码背景: 一个公司,有研发、行政、财务、市场、后勤等部门;比如发工资,需要财务部门给每个部门发,那么需要在财务部门添加每个部门的引用;在比如研发部门进行请假需要行政部门进行审批,还需要财务部门进行扣款,那么研发部门需要添加行政部门和财务部门的引用;部门之间依赖关系复杂错乱,耦合度也高,为了解决这种问题,使用中介者来处理;所有部门之间不在直接进行交互,而是统一通过中介者来交互,每个部门中不必在存放多个可能用到的其他部门的引用,只需要存放一个中介者的引用即可;应用方面,进行初始化一个具体中介者,并把需要的部门注册到中介者中。以下是以请假为例的中介者代码:
/**
* 部门基类
*/
public abstract class Department {
public String deartmentName;
public String getDeartmentName(){
return deartmentName;
}
public abstract void setMediator(Mediator mediator);
}
/**
* 研发部门
*/
public class DevelopDepartMent extends Department{
private Mediator mediator;
public DevelopDepartMent(){
deartmentName = "developp";
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
/**
* 研发部门的能力之一
*/
public void createProduct(){
System.out.println("研发部门生产了一个产品。。。");
}
}
/**
* 行政部门
*/
public class AdminDepartment extends Department{
private Mediator mediator;
public AdminDepartment(){
deartmentName="admin";
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
/**
* 行政部门能力之一
*/
public void audit(){
System.out.println("审批了一个任务。。。");
}
}
/**
* 财务部门
*/
public class FinanceDepartment extends Department{
private Mediator mediator;
public FinanceDepartment(){
deartmentName = "finance";
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
/**
* 行政部门的能力之一
*/
public void giveMoney(long money){
System.out.println("进行了一次拨款,拨款数额为:"+money);
}
}
/**
* 中介者
*/
public interface Mediator {
//注册组件;具体的中介者把各个组件注册到中介者中,并把组件中的中介者设置为当前的具体中介者
void registerComponent(Department department);
//请假
void leave();
}
/**
* 具体的一个中介者
*/
public class MediatorImpl1 implements Mediator{
private DevelopDepartMent developDepartMent;
private AdminDepartment adminDepartment;
private FinanceDepartment financeDepartment;
@Override
public void registerComponent(Department department) {
department.setMediator(this);
switch (department.getDeartmentName()){
case "developp":
developDepartMent = (DevelopDepartMent) department;
break;
case "admin":
adminDepartment = (AdminDepartment) department;
break;
case "finance":
financeDepartment = (FinanceDepartment) department;
break;
}
}
/**
* 请假
* 需要行政部门审批,财务部门扣款
*/
public void leave(){
adminDepartment.audit();
financeDepartment.giveMoney(-200l);
}
public class TestMediator {
public static void main(String[] args) {
Mediator mediator = new MediatorImpl1();
//所有部门解耦,把所有部门都注册到中介者中
mediator.registerComponent(new DevelopDepartMent());
mediator.registerComponent(new AdminDepartment());
mediator.registerComponent(new FinanceDepartment());
mediator.leave();
}
}
测试结果: