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

 更新时间:2023年06月29日 08:23:49   作者:demo007x  
中介者是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通,达到减少组件之间依赖关系的目的,因此本文就给大家详细介绍一下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 中介者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoFrame框架使用避坑指南和实践干货

    GoFrame框架使用避坑指南和实践干货

    这篇文章主要为大家介绍了GoFrame框架使用避坑指南和实践干货,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang内存管理之内存逃逸分析

    Golang内存管理之内存逃逸分析

    逃逸分析是指由编译器决定内存分配的位置,不需要程序员指定,这篇文章主要为大家详细介绍了Golang中内存逃逸分析的几种方法,需要的可以参考一下
    2023-07-07
  • golang变量uint、int大小溢出后的结果方式

    golang变量uint、int大小溢出后的结果方式

    在Go语言中,变量的大小溢出后,`uint`类型会回绕到最小值,而`int`类型会回绕到最大值的相反数,例如,`uint8`溢出后会变成0,`int64`溢出后会变成最小的负数
    2024-12-12
  • Golang空接口与类型断言的实现

    Golang空接口与类型断言的实现

    本文主要介绍了Golang空接口与类型断言的实现,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 解读golang中的const常量和iota

    解读golang中的const常量和iota

    这篇文章主要介绍了golang中的const常量和iota,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • golang WebDav 多目录文件服务的实现

    golang WebDav 多目录文件服务的实现

    本文介绍使用Golang实现一个WebDav服务,支持在一个端口下为多个用户提供独立的目录访问权限,通过示例代码介绍了配置多个目录,并实现基本的用户认证,感兴趣的可以了解一下
    2025-12-12
  • Golang表示枚举类型的详细讲解

    Golang表示枚举类型的详细讲解

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解,感兴趣的朋友跟随小编一起看看吧
    2021-09-09
  • 一文介绍Go语言中的指针

    一文介绍Go语言中的指针

    指针是一个存储变量内存地址的变量,本文主要介绍了Go语言中的指针,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 浅析Go语言中闭包的使用

    浅析Go语言中闭包的使用

    闭包是一个函数和其相关的引用环境组合的一个整体。本文主要为大家介绍一下Go语言中闭包的使用,文中的示例代码讲解详细,对我们学习Go语言有一定帮助,需要的可以参考一下
    2022-12-12
  • Go设计模式之备忘录模式讲解和代码示例

    Go设计模式之备忘录模式讲解和代码示例

    备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原,本文就通过代码示例给大家讲讲Go备忘录模式,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08

最新评论