描述

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

主要角色

  • Mediator: 抽象中介者
  • ConcreteMediator: 具体中介者
  • Colleague: 抽象同事类
  • ConcreteColleague: 具体同事类

代码实现

  1. public abstract class AbstractCaptain {
  2. public Tower tower;
  3. public void setTower(Tower tower) {
  4. this.tower = tower;
  5. }
  6. abstract void takeOff();
  7. abstract void landing();
  8. }
  1. public class SC888 extends AbstractCaptain{
  2. @Override
  3. void takeOff() {
  4. System.out.println("SC888起飞");
  5. tower.isDepartures("qf");
  6. }
  7. @Override
  8. void landing() {
  9. System.out.println("SC888降落");
  10. tower.isDepartures("jl");
  11. }
  12. }
  1. public class WU777 extends AbstractCaptain{
  2. @Override
  3. void takeOff() {
  4. System.out.println("WU777起飞");
  5. tower.isDepartures("qf");
  6. }
  7. @Override
  8. void landing() {
  9. System.out.println("WU777降落");
  10. tower.isDepartures("jl");
  11. }
  12. }
  1. public class Tower {
  2. //跑道是否可以起飞
  3. public boolean track = true;
  4. public void isDepartures(String status){
  5. if("qf".equals(status)){
  6. if(track){
  7. System.out.println("起飞成功");
  8. track=false;
  9. }else {
  10. System.out.println("起飞失败");
  11. }
  12. }
  13. if("jl".equals(status)){
  14. if(track){
  15. System.out.println("降落成功");
  16. track=false;
  17. }else {
  18. System.out.println("降落失败");
  19. }
  20. }
  21. }
  22. }
  1. public class IntermediaryTest {
  2. public static void main(String[] args) {
  3. SC888 sc888 = new SC888();
  4. WU777 wu777 = new WU777();
  5. Tower tower = new Tower();
  6. sc888.setTower(tower);
  7. wu777.setTower(tower);
  8. sc888.takeOff();
  9. wu777.takeOff();
  10. }
  11. }
  12. //测试
  13. SC888起飞
  14. 起飞成功
  15. WU777起飞
  16. 起飞失败

使用场景

什么场景用到?

  • SpringMVC 的 DispatcherServlet是一个中介者,他会提取Controller、Model、View来进行调用。而无需controller直接调用view之类的渲染方法
  • 分布式系统中的网关
  • 迪米特法则的一个典型应用
  • 中介者和外观(门面)模式区别?
  • 中介者双向操作,门面偏向于封装某一方 …….