中介者模式原理

中介者模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合性,通过引入一个中介者对象来协调这些对象的交互。中介者模式通过将对象之间的交互逻辑集中管理,减少了对象之间的直接依赖关系,提高了系统的可维护性和扩展性。 
 
中介者模式的核心原理是将对象之间的交互逻辑封装到中介者对象中,使得对象之间不再直接相互引用,而是通过中介者进行通信。当一个对象需要与其他对象进行交互时,它只需要与中介者对象进行通信,由中介者对象负责将消息传递给其他相关对象。 
 
中介者模式通常包含以下几个角色: 
- 抽象中介者(Abstract Mediator):定义了中介者对象的接口,提供了对象之间的通信方法。 
- 具体中介者(Concrete Mediator):实现了抽象中介者接口,负责协调对象之间的交互关系。 
- 抽象同事类(Abstract Colleague):定义了同事类的接口,包含了与中介者通信的方法。 
- 具体同事类(Concrete Colleague):实现了抽象同事类接口,每个具体同事类都与一个中介者对象进行通信。 
 
中介者模式适用于对象之间的交互逻辑较为复杂、对象之间的耦合性较高的场景。通过引入中介者对象,可以将复杂的交互逻辑集中管理,降低对象之间的耦合度,提高代码的可维护性和扩展性。 

以下是一个简单的中介者模式的示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package main

import "fmt"

// 抽象中介者
type Mediator interface {
	SendMessage(message string, colleague Colleague)
}

// 抽象同事类
type Colleague interface {
	Send(message string)
	Receive(message string)
}

// 具体中介者
type ConcreteMediator struct {
	colleague1 Colleague
	colleague2 Colleague
}

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

// 具体同事类
type ConcreteColleague1 struct {
	mediator Mediator
}

func (c *ConcreteColleague1) Send(message string) {
	c.mediator.SendMessage(message, c)
}
func (c *ConcreteColleague1) Receive(message string) {
	fmt.Println("ConcreteColleague1 received:", message)
}

type ConcreteColleague2 struct {
	mediator Mediator
}

func (c *ConcreteColleague2) Send(message string) {
	c.mediator.SendMessage(message, c)
}
func (c *ConcreteColleague2) Receive(message string) {
	fmt.Println("ConcreteColleague2 received:", message)
}

// 客户端代码
func main() {
	mediator := &ConcreteMediator{}
	colleague1 := &ConcreteColleague1{mediator: mediator}
	colleague2 := &ConcreteColleague2{mediator: mediator}
	mediator.colleague1 = colleague1
	mediator.colleague2 = colleague2
	colleague1.Send("Hello, colleague2!")
	colleague2.Send("Hi, colleague1!")
}

在上述示例中,我们定义了抽象中介者接口 Mediator 和抽象同事类接口 Colleague 。具体中介者类 ConcreteMediator 实现了中介者接口,负责协调同事类之间的交互。具体同事类 ConcreteColleague1 和 ConcreteColleague2 实现了同事类接口,每个同事类都与中介者对象进行通信。

在客户端代码中,我们创建了中介者对象和同事类对象,并将同事类对象与中介者对象进行关联。通过调用同事类的 Send() 方法,同事类可以向其他同事类发送消息,中介者对象负责将消息传递给目标同事类。最终,每个同事类都会收到并处理自己的消息。

通过中介者模式,我们可以实现对象之间的松耦合,将复杂的交互逻辑集中管理,提高代码的可维护性和扩展性。