最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang設(shè)計模式之責任鏈模式講解和代碼示例

 更新時間:2023年06月25日 08:58:29   作者:demo007x  
責任鏈是一種行為設(shè)計模式, 允許你將請求沿著處理者鏈進行發(fā)送, 直至其中一個處理者對其進行處理,本文就詳細給大家介紹一下Golang 責任鏈模式,文中有詳細的代碼示例,需要的朋友可以參考下

Golang 責任鏈模式講解和代碼示例

該模式允許多個對象來對請求進行處理, 而無需讓發(fā)送者類與具體接收者類相耦合。 鏈可在運行時由遵循標準處理者接口的任意處理者動態(tài)生成。

概念示例

讓我們來看看一個醫(yī)院應(yīng)用的責任鏈模式例子。 醫(yī)院中會有多個部門, 如:

  • 前臺
  • 醫(yī)生
  • 藥房
  • 收銀

病人來訪時, 他們首先都會去前臺, 然后是看醫(yī)生、 取藥, 最后結(jié)賬。 也就是說, 病人需要通過一條部門鏈, 每個部門都在完成其職能后將病人進一步沿著鏈條輸送。

此模式適用于有多個候選選項處理相同請求的情形, 適用于不希望客戶端選擇接收者 (因為多個對象都可處理請求) 的情形, 還適用于想將客戶端同接收者解耦時。 客戶端只需要鏈中的首個元素即可。

正如示例中的醫(yī)院, 患者在到達后首先去的就是前臺。 然后根據(jù)患者的當前狀態(tài), 前臺會將其指向鏈上的下一個處理者。

department.go: 處理者接口

package main
type Department interface {
	execute(*Patient)
	setNext(Department)
}

reception.go: 具體處理者

package main
import "fmt"
// 前臺
type Reception struct {
	next Department
}
func (r *Reception) execute(p *Patient) {
	if p.registrationDone {
		fmt.Println("Patient registration already done")
		r.next.execute(p)
	}
	fmt.Println("Reception registering patient")
	p.registrationDone = true
	r.next.execute(p)
}
func (r *Reception) setNext(next Department) {
	r.next = next
}

doctor.go: 具體處理者

package main
import "fmt"
type Doctor struct {
	next Department
}
func (d *Doctor) execute(p *Patient) {
	if p.doctorCheckUpDone {
		fmt.Println("Doctor checkup already done")
		d.next.execute(p)
		return
	}
	fmt.Println("Doctor checking patient")
	p.doctorCheckUpDone = true
	d.next.execute(p)
}
func (d *Doctor) setNext(next Department) {
	d.next = next
}

medical.go: 具體處理者

package main
import "fmt"
type Medical struct {
	next Department
}
func (m *Medical) execute(p *Patient) {
	if p.medicineDone {
		fmt.Println("Medicine already given to patient")
		m.next.execute(p)
		return
	}
	fmt.Println("Medical giving medicine to patient")
	p.medicineDone = true
	m.next.execute(p)
}
func (m *Medical) setNext(next Department) {
	m.next = next
}

cashier.go: 具體處理者

package main
import "fmt"
type Cashier struct {
	next Department
}
func (c *Cashier) execute(p *Patient) {
	if p.paymentDone {
		fmt.Println("Payment Done")
	}
	fmt.Println("Cashier getting money from patient patient")
}
func (c *Cashier) setNext(next Department) {
	c.next = next
}

patient.go

package main
type Patient struct {
	name              string
	registrationDone  bool // 注冊狀態(tài)
	doctorCheckUpDone bool // 醫(yī)生是否檢查完成
	medicineDone      bool // 是否取完了藥品
	paymentDone       bool // 是否已經(jīng)支付
}

main.go: 客戶端代碼

package main
func main() {
	cashier := &Cashier{}
	// set next for medical department
	medical := &Medical{}
	medical.setNext(cashier)
	//Set next for doctor department
	doctor := &Doctor{}
	doctor.setNext(medical)
	//Set next for reception department
	reception := &Reception{}
	reception.setNext(doctor)
	patient := &Patient{name: "abc"}
	//Patient visiting
	reception.execute(patient)
}

utput.txt: 執(zhí)行結(jié)果

Reception registering patient
Doctor checking patient
Medical giving medicine to patient
Cashier getting money from patient patient

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

相關(guān)文章

  • 深入了解Go語言中的作用域和變量重聲明

    深入了解Go語言中的作用域和變量重聲明

    在?Go?語言中,代碼塊的嵌套和作用域是程序設(shè)計的關(guān)鍵概念之一,本文將探討如何在?Go?語言中利用代碼塊的嵌套和作用域來組織代碼,并介紹變量重聲明的規(guī)則,感興趣的可以了解下
    2023-11-11
  • go通過編碼縮短字符串的長度實現(xiàn)方法步驟

    go通過編碼縮短字符串的長度實現(xiàn)方法步驟

    這篇文章主要為大家介紹了go通過編碼縮短字符串的長度實現(xiàn)方法步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 深入了解Go項目標準目錄布局

    深入了解Go項目標準目錄布局

    本文主要介紹了Go項目標準目錄布局,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解Go語言中的監(jiān)視器模式與配置熱更新

    詳解Go語言中的監(jiān)視器模式與配置熱更新

    這篇文章主要為大家詳細介紹了Go語言中的監(jiān)視器模式與配置熱更新的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解

    GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法實例詳解

    這篇文章主要介紹了GO語言協(xié)程互斥鎖Mutex和讀寫鎖RWMutex用法詳解,需要的朋友可以參考下
    2022-04-04
  • Go?結(jié)構(gòu)體序列化的實現(xiàn)

    Go?結(jié)構(gòu)體序列化的實現(xiàn)

    本文主要介紹了Go?結(jié)構(gòu)體序列化的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Golang打包配置文件的實現(xiàn)示例

    Golang打包配置文件的實現(xiàn)示例

    本文主要介紹了Golang打包配置文件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Golang語言如何高效拼接字符串詳解

    Golang語言如何高效拼接字符串詳解

    最近在做性能優(yōu)化,有個函數(shù)里面的耗時特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實有很多種實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Go語言Telnet回音服務(wù)器的實現(xiàn)

    Go語言Telnet回音服務(wù)器的實現(xiàn)

    這篇文章主要介紹了Go語言Telnet回音服務(wù)器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 詳解go語言單鏈表及其常用方法的實現(xiàn)

    詳解go語言單鏈表及其常用方法的實現(xiàn)

    這篇文章主要介紹了詳解go語言單鏈表及其常用方法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

木里| 惠来县| 麻阳| 隆安县| 中西区| 松阳县| 定南县| 泗洪县| 武隆县| 疏附县| 手机| 师宗县| 南充市| 长垣县| 西乡县| 山东省| 瑞丽市| 海阳市| 铜川市| 常州市| 宁夏| 桦川县| 惠来县| 和林格尔县| 仙桃市| 友谊县| 普宁市| 屯昌县| 阜康市| 房山区| 松江区| 桦南县| 赤壁市| 会东县| 忻城县| 吉水县| 安龙县| 安泽县| 大同市| 莱阳市| 互助|