20. 中介者模式(Mediator)

问题:多个对象之间直接互相引用,关系网状,改一个牵动一片。

核心:引入中介者,所有对象只和中介者通信。

class ChatRoom {
  #users = new Map();
  register(user) { this.#users.set(user.name, user); }
  send(from, to, message) {
    const target = this.#users.get(to);
    if (target) target.receive(from, message);
  }
}

class User {
  #room;
  constructor(name, room) {
    this.name = name;
    this.#room = room;
    room.register(this);
  }
  send(to, msg) { this.#room.send(this.name, to, msg); }
  receive(from, msg) { console.log(`${this.name} 收到 ${from} 的消息: ${msg}`); }
}

const room = new ChatRoom();
const alice = new User('Alice', room);
const bob = new User('Bob', room);

alice.send('Bob', '你好!');
// Bob 收到 Alice 的消息: 你好!
package mediator

import "fmt"

type ChatRoom struct {
  users map[string]*User
}

func NewChatRoom() *ChatRoom {
  return &ChatRoom{users: make(map[string]*User)}
}

func (r *ChatRoom) Register(user *User) {
  r.users[user.Name] = user
}

func (r *ChatRoom) Send(from, to, message string) {
  if target, ok := r.users[to]; ok {
    target.Receive(from, message)
  }
}

type User struct {
  Name string
  room *ChatRoom
}

func NewUser(name string, room *ChatRoom) *User {
  u := &User{Name: name, room: room}
  room.Register(u)
  return u
}

func (u *User) Send(to, msg string) {
  u.room.Send(u.Name, to, msg)
}

func (u *User) Receive(from, msg string) {
  fmt.Printf("%s 收到 %s 的消息: %s\n", u.Name, from, msg)
}