Go设计模式之中介者模式讲解和代码示例

Kefira ·
更新时间:2024-09-20
· 946 次阅读

目录

Go 中介者模式讲解和代码示例

概念示例

train.go: 组件

passengerTrain.go: 具体组件

freightTrain.go: 具体组件

mediator.go: 中介者接口

stationManager.go: 具体中介者

main.go: 客户端代码

Go 中介者模式讲解和代码示例

中介者能使得程序更易于修改和扩展, 而且能更方便地对独立的组件进行复用, 因为它们不再依赖于很多其他的类。

概念示例

中介者模式的一个绝佳例子就是火车站交通系统。 两列火车互相之间从来不会就站台的空闲状态进行通信。 station­Manager车站经理可充当中介者, 让平台仅可由一列入场火车使用, 而将其他火车放入队列中等待。 离场火车会向车站发送通知, 便于队列中的下一列火车进站。

train.go: 组件 package main type Train interface { arrive() depart() permitArrival() } passengerTrain.go: 具体组件 package main import "fmt" type PassengerTrain struct { mediator Mediator } // 火车停靠 func (pt *PassengerTrain) arrive() { if !pt.mediator.canArrive(pt) { fmt.Println("PassengerTrain: Arrival blocked, waiting") return } fmt.Println("PassengerTrain: arrived") } // 获取离开 func (pt *PassengerTrain) depart() { fmt.Println("PassengerTrain: leaving") pt.mediator.notifyAboutDeparture() } func (pt *PassengerTrain) permitArrival() { fmt.Println("PassengerTrain: Arrival permitted, arriving") pt.arrive() } freightTrain.go: 具体组件 package main import "fmt" type FreightTrain struct { mediator Mediator } func (g *FreightTrain) arrive() { if !g.mediator.canArrive(g) { fmt.Println("FreightTrain: Arrival blocked, waiting") return } fmt.Println("FreightTrain: arrived") } func (g *FreightTrain) depart() { fmt.Println("FreightTrain: leaving") g.mediator.notifyAboutDeparture() } func (g *FreightTrain) permitArrival() { fmt.Println("FreightTrain: Arrival permitted") g.arrive() } mediator.go: 中介者接口 package main type Mediator interface { canArrive(Train) bool notifyAboutDeparture() } stationManager.go: 具体中介者 package main type StationManager struct { isPlatformFree bool trainQueue []Train } func newStationManager() *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() } } main.go: 客户端代码 package main func main() { stationManager := newStationManager() passengerTrain := &PassengerTrain{ mediator: stationManager, } freightTrain := &FreightTrain{ mediator: stationManager, } passengerTrain.arrive() freightTrain.arrive() passengerTrain.depart() }

到此这篇关于Go设计模式之中介者模式讲解和代码示例的文章就介绍到这了,更多相关Go 中介者模式内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!



中介者模式 GO 示例

需要 登录 后方可回复, 如果你还没有账号请 注册新账号