解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的 相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知 中介者对象即可。中介者使各对象之间耦合松散,而且可以独立地改变它们之间的交互。中介者 模式使网状的多对多关系变成了相对简单的一对多关系(类似于观察者模式,但是单向的,由中介者统一管理。)

  1. class A {
  2. constructor() {
  3. this.number = 0
  4. }
  5. setNumber(num, m) {
  6. this.number = num
  7. if (m) {
  8. m.setB()
  9. }
  10. }
  11. }
  12. class B {
  13. constructor() {
  14. this.number = 0
  15. }
  16. setNumber(num, m) {
  17. this.number = num
  18. if (m) {
  19. m.setA()
  20. }
  21. }
  22. }
  23. class Mediator {
  24. constructor(a, b) {
  25. this.a = a
  26. this.b = b
  27. }
  28. setA() {
  29. let number = this.b.number
  30. this.a.setNumber(number * 10)
  31. }
  32. setB() {
  33. let number = this.a.number
  34. this.b.setNumber(number / 10)
  35. }
  36. }
  37. let a = new A()
  38. let b = new B()
  39. let m = new Mediator(a, b)
  40. a.setNumber(10, m)
  41. console.log(a.number, b.number)
  42. b.setNumber(10, m)
  43. console.log(a.number, b.number)

场景例子

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

    优点

  • 使各对象之间耦合松散,而且可以独立地改变它们之间的交互

  • 中介者和对象一对多的关系取代了对象之间的网状多对多的关系
  • 如果对象之间的复杂耦合度导致维护很困难,而且耦合度随项目变化增速很快,就需要中介者重构代码

    缺点

  • 系统中会新增一个中介者对象,因 为对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象经常是巨大的。中介 者对象自身往往就是一个难以维护的对象。