描述
中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式。
主要角色
- Mediator: 抽象中介者
- ConcreteMediator: 具体中介者
- Colleague: 抽象同事类
- ConcreteColleague: 具体同事类
代码实现
public abstract class AbstractCaptain {
public Tower tower;
public void setTower(Tower tower) {
this.tower = tower;
}
abstract void takeOff();
abstract void landing();
}
public class SC888 extends AbstractCaptain{
@Override
void takeOff() {
System.out.println("SC888起飞");
tower.isDepartures("qf");
}
@Override
void landing() {
System.out.println("SC888降落");
tower.isDepartures("jl");
}
}
public class WU777 extends AbstractCaptain{
@Override
void takeOff() {
System.out.println("WU777起飞");
tower.isDepartures("qf");
}
@Override
void landing() {
System.out.println("WU777降落");
tower.isDepartures("jl");
}
}
public class Tower {
//跑道是否可以起飞
public boolean track = true;
public void isDepartures(String status){
if("qf".equals(status)){
if(track){
System.out.println("起飞成功");
track=false;
}else {
System.out.println("起飞失败");
}
}
if("jl".equals(status)){
if(track){
System.out.println("降落成功");
track=false;
}else {
System.out.println("降落失败");
}
}
}
}
public class IntermediaryTest {
public static void main(String[] args) {
SC888 sc888 = new SC888();
WU777 wu777 = new WU777();
Tower tower = new Tower();
sc888.setTower(tower);
wu777.setTower(tower);
sc888.takeOff();
wu777.takeOff();
}
}
//测试
SC888起飞
起飞成功
WU777起飞
起飞失败
使用场景
什么场景用到?
- SpringMVC 的 DispatcherServlet是一个中介者,他会提取Controller、Model、View来进行调用。而无需controller直接调用view之类的渲染方法
- 分布式系统中的网关
- 迪米特法则的一个典型应用
- 中介者和外观(门面)模式区别?
- 中介者双向操作,门面偏向于封装某一方 …….