Skip to content

中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少类之间的直接通信依赖,通过引入一个中介对象来管理不同类之间的交互。这样做的好处是可以降低类之间的耦合度,使得系统更易于维护和扩展。

在中介者模式中,原本互相通信的对象不再直接交互,而是通过中介者对象进行间接的沟通。中介者负责协调这些对象的行为,并且可以控制它们之间何时以及如何进行通信。

中介者模式的主要角色

  1. Mediator(抽象中介者):定义了同事对象之间的通信接口,通常不包括具体的同事间通信逻辑。
  2. ConcreteMediator(具体中介者):实现了中介者接口,协调各个同事对象之间的交互,了解并维护它的同事对象。
  3. Colleague(抽象同事类):定义了每个同事对象与中介者通信的方法。
  4. ConcreteColleague(具体同事类):实现了抽象同事类中的方法,每一个具体同事都知道它的中介者对象,并通过中介者与其他同事对象进行通信。

在 JavaScript 中的实现

下面是一个简单的例子来说明如何在 JavaScript 中使用中介者模式:

示例:聊天室应用

假设我们需要构建一个简单的聊天室应用程序,用户可以通过发送消息给聊天室,而聊天室会将消息广播给所有在线用户。

javascript
// Mediator(抽象中介者)
class Mediator {
  send(message, colleague) {
    throw new Error("This method should be overridden");
  }
}

// ConcreteMediator(具体中介者)
class ChatRoom extends Mediator {
  constructor() {
    super();
    this.colleagues = [];
  }

  add(colleague) {
    this.colleagues.push(colleague);
  }

  send(message, sender) {
    this.colleagues.forEach((colleague) => {
      if (colleague !== sender) {
        colleague.receive(message);
      }
    });
  }
}

// Colleague(抽象同事类)
class User {
  constructor(name, mediator) {
    this.name = name;
    this.mediator = mediator;
  }

  send(message) {
    console.log(`${this.name} sends: ${message}`);
    this.mediator.send(message, this);
  }

  receive(message) {
    console.log(`${this.name} receives: ${message}`);
  }
}

// 使用示例
const chatRoom = new ChatRoom();

const john = new User("John", chatRoom);
const jane = new User("Jane", chatRoom);

chatRoom.add(john);
chatRoom.add(jane);

john.send("Hello!");
// 输出:
// John sends: Hello!
// Jane receives: Hello!

jane.send("Hi there!");
// 输出:
// Jane sends: Hi there!
// John receives: Hi there!

代码解释

  • Mediator(抽象中介者):声明了一个send方法,该方法由具体中介者实现,用于处理同事间的通信。
  • ChatRoom(具体中介者):实现了Mediator接口,维护了一个同事列表,并提供了一个add方法来添加新的同事。send方法遍历所有同事并将消息发送给除发送者之外的所有同事。
  • User(抽象同事类):虽然在这个例子中没有抽象类,但每个具体的同事(如User)都实现了发送和接收消息的功能。每个同事都知道自己的中介者,并通过调用中介者的send方法发送消息。
  • 使用示例:展示了如何创建一个聊天室实例以及两个用户实例,并演示了他们如何通过聊天室这个中介者进行通信。

应用场景

中介者模式适用于以下几种情况:

  • 当一组对象以复杂的方式相互通讯时,导致它们之间的依赖关系混乱且难以理解。
  • 当希望复用某些对象,但是由于它们引用了太多其他对象而导致难以分离出来。
  • 当需要独立地改变对象及其交互方式时,例如,在 GUI 组件之间传递事件或状态更新。

通过使用中介者模式,可以有效地减少对象之间的直接依赖,简化系统的结构,提高代码的可读性和可维护性。这对于构建复杂的交互系统特别有用。

Released under the MIT License.