UML:建模中介者模式和golang实现

99 阅读3分钟

引言

设计模式是软件开发中的一种常用方法,它能解决在软件设计过程中遇到的一系列特定问题。其中,中介者模式是一种非常有用的行为设计模式,主要用于减少多个类之间的耦合,这样一来,就可以更容易地改变这些类之间的交互。今天,我们将详细探讨中介者模式,并通过UML图和Golang示例来演示其实现。

什么是中介者模式?

中介者模式定义了一个对象,该对象封装了一组对象如何相互交互的信息。通过使用中介者对象,其他对象间的交互可以被隔离和解耦。

中介者模式的适用场景

  • 当对象间存在大量的直接通信,并导致对象之间高度耦合时。
  • 当需要在一个对象的行为和状态中引入新的约束或行为,而不想改变该对象与其他对象之间的交互时。

基本角色

  • 中介者(Mediator):定义了与同事(Colleague)对象交互的接口。
  • 具体中介者(ConcreteMediator):实现中介者接口,并协调各同事对象。
  • 同事类(Colleague):与其他对象交互的对象,但是交互是通过中介者来进行的。

UML模型

下面是使用UML建模的中介者模式:

image.png

中介者模式的行为建模

行为建模通常用于描述系统或应用中各个组件之间的交互行为。在中介者模式中,这尤为重要,因为中介者模式的核心就是调解各个组件(也称为“同事”)之间的交互。

下面,我们通过一个UML序列图来描述中介者模式的行为。

image.png

行为解释

  1. 客户端(Client)通过调用Colleague1Send方法,发出一条消息,目标是Colleague2
  2. Colleague1接收到这个请求后,将消息和自身实例传递给ConcreteMediator
  3. ConcreteMediator判断消息应该传递给哪个同事(在这里是Colleague2),并调用其Receive方法。
  4. Colleague2收到消息。

同样的流程也适用于从Colleague2Colleague1的消息传递。

这样一来,所有的消息传递都通过ConcreteMediator进行,各个同事类(Colleague1Colleague2)之间不再直接通信,从而实现了解耦。

通过行为建模,我们更深入地理解了中介者模式如何工作,以及如何通过一个中介者来管理多个同事对象之间的交互,达到解耦的目的。这样不仅可以简化系统的复杂度,还能提高其可维护性。

Golang示例

package main

import "fmt"

// Mediator 接口
type Mediator interface {
	Send(message string, colleague Colleague)
}

// Colleague 接口
type Colleague interface {
	Send(message string)
	Receive(message string)
}

// ConcreteMediator 结构体
type ConcreteMediator struct {
	colleague1 Colleague
	colleague2 Colleague
}

// Send 方法
func (m *ConcreteMediator) Send(message string, colleague Colleague) {
	if colleague == m.colleague1 {
		m.colleague2.Receive(message)
	} else {
		m.colleague1.Receive(message)
	}
}

// Colleague1 结构体
type Colleague1 struct {
	mediator Mediator
}

// Send 方法
func (c *Colleague1) Send(message string) {
	c.mediator.Send(message, c)
}

// Receive 方法
func (c *Colleague1) Receive(message string) {
	fmt.Println("Colleague1 received:", message)
}

// Colleague2 结构体
type Colleague2 struct {
	mediator Mediator
}

// Send 方法
func (c *Colleague2) Send(message string) {
	c.mediator.Send(message, c)
}

// Receive 方法
func (c *Colleague2) Receive(message string) {
	fmt.Println("Colleague2 received:", message)
}

func main() {
	mediator := &ConcreteMediator{}
	colleague1 := &Colleague1{mediator}
	colleague2 := &Colleague2{mediator}

	mediator.colleague1 = colleague1
	mediator.colleague2 = colleague2

	colleague1.Send("How are you, Colleague2?")
	colleague2.Send("Fine, thank you!")
}

结论

中介者模式是一种非常有用的设计模式,特别是在需要解耦多个类或对象之间交互的场合。通过引入一个中介者,我们可以简化对象之间的交流,使它们更容易管理和维护。

希望这篇文章能帮助你更好地理解和使用中介者模式。如果你有任何疑问或想法,欢迎在下方留言。