欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go設(shè)計(jì)模式之中介者模式講解和代碼示例

 更新時(shí)間:2023年06月29日 08:23:49   作者:demo007x  
中介者是一種行為設(shè)計(jì)模式,讓程序組件通過(guò)特殊的中介者對(duì)象進(jìn)行間接溝通,達(dá)到減少組件之間依賴關(guān)系的目的,因此本文就給大家詳細(xì)介紹一下Go中介者模式,需要的朋友可以參考下

Go 中介者模式講解和代碼示例

中介者能使得程序更易于修改和擴(kuò)展, 而且能更方便地對(duì)獨(dú)立的組件進(jìn)行復(fù)用, 因?yàn)樗鼈儾辉僖蕾囉诤芏嗥渌念悺?/p>

概念示例

中介者模式的一個(gè)絕佳例子就是火車站交通系統(tǒng)。 兩列火車互相之間從來(lái)不會(huì)就站臺(tái)的空閑狀態(tài)進(jìn)行通信。 station­Manager車站經(jīng)理可充當(dāng)中介者, 讓平臺(tái)僅可由一列入場(chǎng)火車使用, 而將其他火車放入隊(duì)列中等待。 離場(chǎng)火車會(huì)向車站發(fā)送通知, 便于隊(duì)列中的下一列火車進(jìn)站。

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")
}
// 獲取離開(kāi)
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()
}

到此這篇關(guān)于Go設(shè)計(jì)模式之中介者模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go 中介者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go重寫(xiě)http請(qǐng)求重定向的方法

    Go重寫(xiě)http請(qǐng)求重定向的方法

    當(dāng)使用Go語(yǔ)言進(jìn)行 HTTP 請(qǐng)求時(shí),默認(rèn)情況下,http.Client 會(huì)自動(dòng)處理服務(wù)器返回的重定向響應(yīng)(3xx 狀態(tài)碼),本文將詳細(xì)介紹如何在 Go 中實(shí)現(xiàn)禁止 HTTP 請(qǐng)求的重定向、限制重定向次數(shù)以及添加自定義重定向策略,需要的朋友可以參考下
    2024-08-08
  • Go routine調(diào)度詳解

    Go routine調(diào)度詳解

    這篇文章主要介紹了Go routine調(diào)度詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析

    Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析

    這篇文章主要為大家介紹了Go語(yǔ)言Goroutines?泄漏場(chǎng)景與防治解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • go實(shí)現(xiàn)冒泡排序的示例代碼

    go實(shí)現(xiàn)冒泡排序的示例代碼

    這篇文章主要介紹了go實(shí)現(xiàn)冒泡排序的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • golang?使用sort.slice包實(shí)現(xiàn)對(duì)象list排序

    golang?使用sort.slice包實(shí)現(xiàn)對(duì)象list排序

    這篇文章主要介紹了golang?使用sort.slice包實(shí)現(xiàn)對(duì)象list排序,對(duì)比sort跟slice兩種排序的使用方式區(qū)別展開(kāi)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • Golang官方限流器庫(kù)實(shí)現(xiàn)限流示例詳解

    Golang官方限流器庫(kù)實(shí)現(xiàn)限流示例詳解

    這篇文章主要為大家介紹了Golang官方限流器庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • goland中使用leetcode插件實(shí)現(xiàn)

    goland中使用leetcode插件實(shí)現(xiàn)

    本文主要介紹了goland中使用leetcode插件實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • golang gin 框架 異步同步 goroutine 并發(fā)操作

    golang gin 框架 異步同步 goroutine 并發(fā)操作

    這篇文章主要介紹了golang gin 框架 異步同步 goroutine 并發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang處理parquet文件實(shí)戰(zhàn)指南

    Golang處理parquet文件實(shí)戰(zhàn)指南

    這篇文章主要給大家介紹了關(guān)于Golang處理parquet文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Go語(yǔ)言中字符串的查找方法小結(jié)

    Go語(yǔ)言中字符串的查找方法小結(jié)

    這篇文章主要介紹了Go語(yǔ)言中字符串的查找方法小結(jié),示例的main函數(shù)都是導(dǎo)入strings包然后使用其中的方法,需要的朋友可以參考下
    2015-10-10

最新評(píng)論