您的位置:首頁 > 滾動 >

責任鏈模式-Golang實現_世界快看

2023-05-06 19:21:28 來源:清一色財經

責任鏈模式會解決這種問題。增加功能時,增加鏈上的處理者即可。不同的維護者維護自己的處理者。

?責任鏈模式的定義:是一種行為型設計模式,請求會沿著處理者鏈進行傳遞。收到請求后,每個處理者均可對請求進行處理,或將其傳遞給鏈的下個處理者。


(資料圖片僅供參考)

在實際工作中,常常會遇到功能擴充,有可能會導致代碼越來越臃腫或邏輯越來越復雜。維護的程序員也可能不止一個,也會導致一些混亂。

責任鏈模式會解決這種問題。增加功能時,增加鏈上的處理者即可。不同的維護者維護自己的處理者。

責任鏈模式滿足單一職責原則,請求和處理者進行了解耦,只要將請求發給一個處理者即可;各個處理者也完成各自的功能。

責任鏈模式滿足開閉原則。可以在不更改現有代碼的情況下在程序中新增處理者。

責任鏈模式中可以控制請求處理的順序。

下面來看代碼實現:

我們來模擬最高指揮部對各個作戰部隊下達指令的情形。請求者就是最高指揮部(HighCommand),處理者有炮兵部隊(Artillery)、導彈部隊(MissileForce)、核部隊(NuclearForce)。各部隊對最高指揮部發出的攻擊指令進行各自的處理。UML圖如下:

interface.go文件:

package maintype Forces interface {  Execute(*HighCommand)  SetNext(Forces)}

artillery.go文件:

package mainimport "fmt"type Artillery struct {  next Forces}func (f *Artillery) Execute(command *HighCommand) {  if command.ShowCommand() == "shell attack" {    fmt.Println("Shell Attack!")    return  }  fmt.Println("Send to next")  f.next.Execute(command)}func (f *Artillery) SetNext(next Forces) {  f.next = next}

missileForce.go文件:

package mainimport "fmt"type MissileForce struct {  next Forces}func (f *MissileForce) Execute(command *HighCommand) {  if command.ShowCommand() == "missile attack" {    fmt.Println("Missile Attack!")    return  }  fmt.Println("Send to next")  f.next.Execute(command)}func (f *MissileForce) SetNext(next Forces) {  f.next = next}

nuclearForce.go文件:

package mainimport "fmt"type NuclearForce struct {  next Forces}func (f *NuclearForce) Execute(command *HighCommand) {  if command.ShowCommand() == "nuclear attack" {    fmt.Println("Nuclear Attack!")    return  }  fmt.Println("Send to next")  f.next.Execute(command)}func (f *NuclearForce) SetNext(next Forces) {  f.next = next}

end.go文件(鏈尾):

package maintype EndChain struct{}func (f *EndChain) Execute(command *HighCommand) {}func (f *EndChain) SetNext(next Forces) {}

client.go文件:

package maintype HighCommand struct {  name string}func (c *HighCommand) ShowCommand() string {  return c.name}

main.go文件:

package mainfunc main() {  // setup chain  end := &EndChain{}  nuclearForce := &NuclearForce{}  nuclearForce.SetNext(end)  missileForce := &MissileForce{}  missileForce.SetNext(nuclearForce)  artillery := &Artillery{}  artillery.SetNext(missileForce)  command := &HighCommand{name: "nuclear attack"}  artillery.Execute(command)}

運行go run *.go即可。

該例子運行結果為:

最近更新

国产亚洲色婷婷久久99精品91| 精品人无码一区二区三区| 精品人妻无码一区二区三区蜜桃一 | 久久久久九九精品影院| 久久久久久久精品妇女99| 国产叼嘿久久精品久久| 精品久久久久久中文字幕大豆网| 国产精品无码v在线观看| 四虎国产精品永久在线无码| 久久国产乱子伦精品免费不卡| 四虎精品影库4HUTV四虎| 精品国产一区二区三区久久久狼| 国产A三级久久精品| 日本一区二区三区精品视频| 91精品国产亚洲爽啪在线影院| 尹人久久久香蕉精品| 国产嫩草影院精品免费网址| 国产成人精品免费视频大| 久久青青成人亚洲精品| 久久91这里精品国产2020| 国产精品素人福利| 亚洲国产精品美女久久久久| 91国内揄拍国内精品情侣对白 | 国产成人精品无码一区二区老年人| 亚洲精品美女久久久久9999| 九九在线精品视频专区| 精品亚洲一区二区三区在线播放| 国产精品乱子乱XXXX| 狠狠精品干练久久久无码中文字幕| 亚洲国产精品综合久久久| 久久久久成人精品一区二区 | 国内精品伊人久久久久AV影院| 拍国产乱人伦偷精品视频| 日韩精品视频免费网址| 精品无人乱码一区二区三区| AV无码精品一区二区三区| 777精品成人影院| 精品人妻大屁股白浆无码| 亚洲午夜久久久精品影院| 无码国产精品一区二区免费模式 | 亚洲AV无码一区二区三区久久精品|