设计模式之中介模式

miloyang
0 评论
/ /
442 阅读
/
3533 字
22 2023-11

简介

中介模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介对象来协调其他对象之间的交互。中介者模式的目标是减少对象之间的直接通信,将复杂的交互关系变得更加松散,从而提高系统的可维护性和可扩展性。

中介者模式涉及到以下几个主要角色:

  • 中介者(Mediator)

    定义了一个接口用于与各同事对象通信,负责协调各同事对象的交互关系。

  • 具体中介者(ConcreteMediator)

    实现了中介者接口,负责实际的协调工作,了解各同事对象的行为并协调它们的交互。

  • 同事对象(Colleague)

    每个同事对象都知道中介者对象,并通过中介者来与其他同事对象通信。同事对象之间的直接通信被替代为与中介者的间接通信。

  • 具体同事对象(ConcreteColleague)

    实现了同事对象接口,每个具体同事对象都有自己的行为,同时通过中介者来协调与其他同事对象的交互。

jugelizi

你想买车,但是对车不了解,你又不能一个个去问,这样太麻烦了,于是你就拉了一个群,在群里面问,群里面的人直接在群里回复,不需要点对点了。对,就是聊天室的功能,聊天室就是中介,它协调消息传递。

Demo

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

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

func NewConcreteMediator() *ConcreteMediator {
    return &ConcreteMediator{
        users: make(map[string]User),
    }
}

func (c *ConcreteMediator) RegisterUser(user User) {
    c.users[user.GetName()] = user
}

func (c *ConcreteMediator) SendMessage(message string, user User) {
    fmt.Printf("[%s] sends message: %s\n", user.GetName(), message)
    for _, u := range c.users {
        if u != user {
            u.ReceiveMessage(message)
        }
    }
}

// User 用户接口
type User interface {
    SendMessage(message string)
    ReceiveMessage(message string)
    GetName() string
}

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

func NewConcreteUser(name string, mediator Mediator) *ConcreteUser {
    return &ConcreteUser{
        name:     name,
        mediator: mediator,
    }
}

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

func (u *ConcreteUser) ReceiveMessage(message string) {
    fmt.Printf("[%s] receives message: %s\n", u.name, message)
}

func (u *ConcreteUser) GetName() string {
    return u.name
}

test

func TestMediator(t *testing.T) {
    // 创建聊天室中介者
    chatMediator := NewConcreteMediator()

    // 创建用户并注册到中介者
    user1 := NewConcreteUser("User1", chatMediator)
    user2 := NewConcreteUser("User2", chatMediator)
    user3 := NewConcreteUser("User3", chatMediator)

    chatMediator.RegisterUser(user1)
    chatMediator.RegisterUser(user2)
    chatMediator.RegisterUser(user3)

    // 用户发送消息
    user1.SendMessage("Hello, 我想问下,我有两百块钱可以买什么车?")
    user2.SendMessage("Hi, User1!你可以买个锤子")
}

在这个例子中,Mediator 是中介者接口,定义了用户之间的消息传递方法。ConcreteMediator 是具体中介者,负责协调用户之间的消息传递。User 是用户接口,定义了发送和接收消息的方法。ConcreteUser 是具体用户,实现了用户接口,通过中介者来发送和接收消息。

在客户端,我们创建了一个聊天室中介者,以及三个用户,并将用户注册到中介者。用户之间通过中介者发送消息,中介者负责将消息传递给其他用户。这样,用户之间的直接通信被简化,系统更易于维护和扩展。

作用和场景

  • 解耦对象之间的关系

    中介者模式可以降低对象之间的直接依赖关系,使得对象之间的通信更加松散。每个对象只需要与中介者进行通信,而无需直接与其他对象通信。

  • 集中控制交互逻辑

    中介者模式将对象之间的交互逻辑集中在中介者中,使得系统更容易理解和维护。中介者可以处理对象之间复杂的交互关系,而不需要将这些逻辑分散到各个对象中。

  • 支持多对多的关系

    中介者模式适用于多个对象之间存在复杂的交互关系,形成多对多的关系网。

当系统中对象之间存在复杂的交互关系,每个对象都需要了解其他对象的行为时,可以考虑使用中介者模式。

当对象之间的通信方式多样,且难以通过简单的直接通信来解决时,中介者模式可以提供更灵活的解决方案。

当类的数量急剧增加,导致类与类之间关系复杂时,为减少子类生成,使用中介者模式将各个同事类分离,各类只保留与中介者的关系,这样会减小系统的维护难度。

总体而言,中介者模式适用于系统中对象之间存在复杂的交互关系,通过引入中介者来解耦对象之间的直接关系,提高系统的可维护性和可扩展性。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步