作用
- 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
何时使用
优点
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
- 符合迪米特原则。
开发常见场景
- MVC模式(其中的C,控制器就是一个中介者,M和V都和它打交道))
- 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
- java.lang.reflect.Method#invoe()
实例
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 13:51
* @Version:
* @Acton: 部门
*/
//同事类的借口
public interface Department {
void selfAction(); //本部门需要做的事情
void outAction(); //向总经理发出申请
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 13:47
* @Version:
* @Acton: 中介者
*/
public interface Mediator {
void register(String dname,Department d);
void command(String name);
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 16:01
* @Version:
* @Acton:
*/
public class President implements Mediator {
private Map<String,Department> map = new HashMap<>();
@Override
public void register(String dname, Department d) {
map.put(dname,d);
}
@Override
public void command(String name) {
map.get(name).selfAction();
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 13:54
* @Version:
* @Acton: 研发部
*/
public class Development implements Department {
private Mediator mediator; //持有中介者的引用
public Development(Mediator mediator) {
this.mediator = mediator;
mediator.register("developent",this);
}
@Override
public void selfAction() {
System.out.println("专业搞技术 ");
}
@Override
public void outAction() {
System.out.println("向财务要钱");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 13:54
* @Version:
* @Acton: 财务部
*/
public class Finacial implements Department {
private Mediator mediator; //持有中介者的引用
public Finacial(Mediator mediator) {
this.mediator = mediator;
mediator.register("finacial",this);
}
@Override
public void selfAction() {
System.out.println("数钱");
}
@Override
public void outAction() {
System.out.println("公司最新赚钱太少了,发不起工资了");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 13:54
* @Version:
* @Acton: 市场部
*/
public class Market implements Department {
private Mediator mediator; //持有中介者的引用
public Market(Mediator mediator) {
this.mediator = mediator;
mediator.register("market",this);
}
@Override
public void selfAction() {
System.out.println("接项目");
}
@Override
public void outAction() {
System.out.println("承接项目需要资金支持");
mediator.command("finacial");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/7 16:04
* @Version:
* @Acton:
*/
public class TestMediatorDemo {
public static void main(String[] args){
test1();
}
private static void test1() {
Mediator president = new President();
Market market = new Market(president);
Finacial finacial = new Finacial(president);
Development development = new Development(president);
market.selfAction();
market.outAction();
}
}
关系结构图
