中介者模式

中介者模式的概念

中介者模式是一种行为设计模式,它允许你减少对象之间的直接交互,将这些交互移到一个中介者对象中。这样可以降低对象之间的耦合度,使系统更易于维护和扩展。

中介者模式的作用

降低耦合度:通过引入中介者对象,各个对象之间的交互不再直接进行,而是通过中介者进行,降低了对象之间的耦合度。

集中控制:中介者对象可以集中控制对象之间的交互,便于管理和维护。

简化对象接口:对象只需要与中介者交互,不需要知道其他对象的接口,简化了对象的接口。

中介者模式应用场景

对象之间存在复杂的交互关系:当对象之间的交互关系变得复杂时,使用中介者模式可以简化这些交互。

需要简化对象之间的交互:当对象之间的交互变得复杂且难以维护时,可以使用中介者模式来简化这些交互。

需要集中控制对象之间的交互:当需要集中控制对象之间的交互时,可以使用中介者模式。

Go 语言实现中介者模式示例

下面是一个简单的中介者模式的Go语言示例。在这个例子中,我们有一个聊天室(中介者),多个用户可以通过聊天室进行交流。

package main

import (
	"fmt"
)

// Mediator 中介者接口
type Mediator interface {
	SendMessage(user User, message string)
}

// ConcreteMediator 具体中介者
type ConcreteMediator struct {
	users []User
}

// 添加用户
func (m *ConcreteMediator) AddUser(user User) {
	user.SetMediator(m)
	m.users = append(m.users, user)
}

// 发送消息
// 实现了 Mediator 接口
func (m *ConcreteMediator) SendMessage(user User, message string) {
	for _, u := range m.users {
		if u != user {
			u.Receive(message)
		}
	}
}

// User 用户接口
type User interface {
	Send(message string)
	Receive(message string)
	SetMediator(mediator Mediator)
}

// ConcreteUser 具体用户
type ConcreteUser struct {
	name     string
	mediator Mediator
}

func (u *ConcreteUser) Send(message string) {
	fmt.Printf("%s sends: %s\n", u.name, message)
	u.mediator.SendMessage(u, message)
}
func (u *ConcreteUser) Receive(message string) {
	fmt.Printf("%s receives: %s\n", u.name, message)
}
func (u *ConcreteUser) SetMediator(mediator Mediator) {
	u.mediator = mediator
}

func main() {
	mediator := &ConcreteMediator{}

	user1 := &ConcreteUser{name: "Alice"}
	user2 := &ConcreteUser{name: "Bob"}

	mediator.AddUser(user1)
	mediator.AddUser(user2)

	user1.Send("Hello Bob!")
	user2.Send("Hi Alice!")
}