概念
- 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式


主要角色
- Mediator: 抽象中介者
- ConcreteMediator: 具体中介者
- Colleague: 抽象同事类
- ConcreteColleague: 具体同事类
/** * Colleague: 抽象同事类 */public abstract class Captain { //起飞 abstract void fly(); //降落 abstract void land(); //完成 abstract void success();}
/**
* ConcreteColleague: 具体同事类
*/
public class SC8633 extends Captain {
ControlTower controlTower;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("SC8633 请求起飞......");
//问每个机长能否起飞?
controlTower.acceptRequest(this, "fly");
}
@Override
void land() {
System.out.println("SC8633 请求降落......");
//问每个机长能否起飞?
controlTower.acceptRequest(this, ";land");
}
@Override
void success() {
System.out.println("SC8633 完成......");
//问每个机长能否起飞?
controlTower.acceptRequest(this, "fly");
}
}
/**
* ConcreteColleague: 具体同事类
*/
public class HU8778 extends Captain{
ControlTower controlTower;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("HU8778请求起飞......");
//问每个机长能否起飞?
controlTower.acceptRequest(this,"fly");
}
@Override
void land() {
System.out.println("HU8778请求降落......");
controlTower.acceptRequest(this,"land");
}
@Override
void success() {
System.out.println("完成......");
controlTower.acceptRequest(this,"success");
}
}
/**
* ConcreteMediator: 具体中介者
*/
public class ControlTower {
private boolean canDo = true;
//接受请求...
public void acceptRequest(Captain captain,String action){
if("fly".equals(action)||"land".equals(action)){
//
if(canDo == true){
System.out.println("允许......");
canDo = false;
}else {
System.out.println("不允许.....");
}
}
if("success".equals(action)){
canDo = true;
}
}
}
应用场景
- SpringMVC 的 DispatcherServlet是一个中介者,他会提取Controller、Model、View来进行调用。而无需controller直接调用view之类的渲染方法
- 分布式系统中的网关
- 迪米特法则的一个典型应用
- 中介者和外观(门面)模式区别?