20. 中介者模式(Mediator)
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)
}