行为型:八. 中介者模式
中介模式是什么
中介者模式是一种行为设计模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以相互独立地改变它们之间地交互。
为什么用中介模式
中介者模式建议你停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象,通过中介者对象重定向调用行为, 以间接的方式进行合作。 最终, 组件仅依赖于一个中介者类, 无需与多个其他组件相耦合。
中介模式怎么实现
这里是用火车进站来举例只有在站台空闲的时候火车才可以进站,而车站的调度就是中介,每列火车都是和车站调度(中介)来沟通的。
mediator.go 中介
package mediator
type mediator interface {
canArrive(train) bool
notifyAboutDeparture()
}
type stationManager struct {
isPlatformFree bool // 站台是否空闲
trainQueue []train
}
func newStationManger() *stationManager {
return &stationManager{
isPlatformFree: true,
}
}
func (s *stationManager) canArrive(t train) bool {
if s.isPlatformFree {
s.isPlatformFree = false
return true
}
s.trainQueue = append(s.trainQueue, t)
return false
}
func (s *stationManager) notifyAboutDeparture() {
if !s.isPlatformFree {
s.isPlatformFree = true
}
if len(s.trainQueue) > 0 {
firstTrainInQueue := s.trainQueue[0]
s.trainQueue = s.trainQueue[1:]
firstTrainInQueue.permitArrival()
}
}
train.go 火车组件
type train interface {
arrive() // 到达
depart()
permitArrival()
}
passenger_train.go 客运火车
package mediator
import "fmt"
// 客运火车
type passengerTrain struct {
mediator mediator
}
func (p *passengerTrain) arrive() {
if !p.mediator.canArrive(p) {
fmt.Println("客运火车到达,等待入站")
return
}
fmt.Println("客运火车入站")
}
func (p *passengerTrain) depart() {
fmt.Println("客运火车离开")
p.mediator.notifyAboutDeparture()
}
func (p *passengerTrain) permitArrival() {
fmt.Println("客运火车允许入站")
p.arrive()
}
freight_train.go 货运火车
package mediator
import "fmt"
// 货运火车
type freightTrain struct {
mediator mediator
}
func (g *freightTrain) arrive() {
if !g.mediator.canArrive(g) {
fmt.Println("货运火车到达,等待入站")
return
}
fmt.Println("货运火车入站")
}
func (g *freightTrain) depart() {
fmt.Println("货运火车离开")
g.mediator.notifyAboutDeparture()
}
func (g *freightTrain) permitArrival() {
fmt.Println("货运火车允许入站")
g.arrive()
}
调用示例
package mediator
func Example() {
stationManager := newStationManger()
passengerTrain := &passengerTrain{
mediator: stationManager,
}
freightTrain := &freightTrain{
mediator: stationManager,
}
passengerTrain.arrive()
freightTrain.arrive()
passengerTrain.depart()
}
// 客运火车入站
// 货运火车到达,等待入站
// 客运火车离开
// 货运火车允许入站
// 货运火车入站
优点
- 单一职责原则。 你可以将多个组件间的交流抽取到同一位置, 使其更易于理解和维护。
- 开闭原则。 你无需修改实际组件就能增加新的中介者。
- 你可以减轻应用中多个组件间的耦合情况。
缺点
- 一段时间后, 中介者可能会演化成为上帝对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!