Go中介者模式

87 阅读4分钟

Go语言中介者模式(Mediator Pattern)是一种行为型设计模式,它允许将一组对象进行解耦,从而减少对象直接的耦合,提高对象的复用和灵活性。中介者模式通常被用来组织复杂的逻辑和交互。下面我们将以一个简单的聊天室程序为例,来说明中介者模式的使用方法。

简介

中介者模式基本思想即为将系统中的一组对象之间的通信和控制进行集中,通过一个中介者对象来协调各个对象之间的交互。具体来说,对象之间不再直接通信,而是通过中介者来进行通信和协调。这样做的好处有:

  • 减少对象之间的依赖关系
  • 避免对象之间出现循环依赖
  • 便于对象的复用和扩展

中介者模式的实现

在Go语言中,实现中介者模式通常需要以下几个步骤:

  1. 定义中介者接口。中介者接口定义了对象之间的交互接口,也可以用来发送消息;
  2. 定义具体的中介者对象。中介者对象通常以抽象类或接口的形式存在;
  3. 定义各个对象的接口。在中介者模式中,各个对象之间通常需要有公共接口,用于与中介者对象通信;
  4. 实现各个对象的具体实现。各个对象可以通过一个或多个中介者对象进行通信;
  5. 在客户端代码中实例化中介者对象和对象集合,并将对应的对象注册到中介者对象中。

下面我们将以一个简单的聊天室程序为例来说明中介者模式的实现。

代码实现

首先我们定义中介者接口:

type Mediator interface {
    AddUser(user User)
    SendMessage(sender User, message string)
}

中介者接口定义了两个方法,AddUser和SendMessage。AddUser方法用于将一个用户添加到当前聊天室中,SendMessage方法用于向当前聊天室中的所有用户发送消息。

然后我们定义各个对象的接口:

type User interface {
    Send(message string)
    Receive(message string)
}

在聊天室中,每个用户都需要有发送和接收消息的功能,因此我们在这里定义了Send和Receive两个方法。

接下来我们定义具体的中介者对象:

type ChatRoom struct {
    users map[User]bool
}

func (c *ChatRoom) AddUser(user User) {
    if c.users == nil {
        c.users = make(map[User]bool)
    }
    c.users[user] = true
}

func (c *ChatRoom) SendMessage(sender User, message string) {
    for user := range c.users {
        if user != sender {
            user.Receive(message)
        }
    }
}

ChatRoom对象实现了中介者接口,实现了AddUser和SendMessage方法。AddUser方法用于将一个用户添加到当前聊天室中,SendMessage方法则用于向当前聊天室中的所有用户发送消息。

最后我们实现各个对象的具体实现:

type ChatUser struct {
    name     string
    mediator Mediator
}

func NewChatUser(name string, mediator Mediator) *ChatUser {
    user := &ChatUser{name: name, mediator: mediator}
    user.mediator.AddUser(user)
    return user
}

func (u *ChatUser) Send(message string) {
    u.mediator.SendMessage(u, message)
}

func (u *ChatUser) Receive(message string) {
    fmt.Printf("%s received message: %s\n", u.name, message)
}

ChatUser对象代表了聊天室中的用户,每个用户都有用户名和所在的聊天室。NewChatUser方法用于创建新的用户实例,并将该用户添加到中介者对象中(也就是将该用户加入到指定的聊天室中)。Send和Receive方法分别实现了发送和接收消息的功能。

最后,在客户端代码中实例化中介者对象和对象集合,并将对应的对象注册到中介者对象中:

func main() {
    mediator := &ChatRoom{}
    user1 := NewChatUser("User 1", mediator)
    user2 := NewChatUser("User 2", mediator)
    user3 := NewChatUser("User 3", mediator)

    user1.Send("Hello, everyone!")
    user2.Send("Hi, User 1!")
    user3.Send("Hey, User 2!")
}

上述代码中,我们实例化了一个ChatRoom对象作为中介者对象,并分别创建了三个ChatUser对象,并将这三个用户都添加到了ChatRoom对象中。

完整代码

package main

import "fmt"

type Mediator interface {
   AddUser(user User)
   SendMessage(sender User, message string)
}

type User interface {
   Send(message string)
   Receive(message string)
}

type ChatRoom struct {
   users map[User]bool
}

func (c *ChatRoom) AddUser(user User) {
   if c.users == nil {
      c.users = make(map[User]bool)
   }
   c.users[user] = true
}

func (c *ChatRoom) SendMessage(sender User, message string) {
   for user := range c.users {
      if user != sender {
         user.Receive(message)
      }
   }
}

type ChatUser struct {
   name     string
   mediator Mediator
}

func NewChatUser(name string, mediator Mediator) *ChatUser {
   user := &ChatUser{name: name, mediator: mediator}
   user.mediator.AddUser(user)
   return user
}

func (u *ChatUser) Send(message string) {
   u.mediator.SendMessage(u, message)
}

func (u *ChatUser) Receive(message string) {
   fmt.Printf("%s received message: %s\n", u.name, message)
}

func main() {
   mediator := &ChatRoom{}
   user1 := NewChatUser("User 1", mediator)
   user2 := NewChatUser("User 2", mediator)
   user3 := NewChatUser("User 3", mediator)

   user1.Send("Hello, everyone!")
   user2.Send("Hi, User 1!")
   user3.Send("Hey, User 2!")
}

执行截图

image.png