责任链模式-Golang实现

开发 前端
责任链模式会解决这种问题。增加功能时,增加链上的处理者即可。不同的维护者维护自己的处理者。

​责任链模式的定义:是一种行为型设计模式,请求会沿着处理者链进行传递。收到请求后,每个处理者均可对请求进行处理,或将其传递给链的下个处理者。

在实际工作中,常常会遇到功能扩充,有可能会导致代码越来越臃肿或逻辑越来越复杂。维护的程序员也可能不止一个,也会导致一些混乱。

责任链模式会解决这种问题。增加功能时,增加链上的处理者即可。不同的维护者维护自己的处理者。

责任链模式满足单一职责原则,请求和处理者进行了解耦,只要将请求发给一个处理者即可;各个处理者也完成各自的功能。

责任链模式满足开闭原则。可以在不更改现有代码的情况下在程序中新增处理者。

责任链模式中可以控制请求处理的顺序。

下面来看代码实现:

我们来模拟最高指挥部对各个作战部队下达指令的情形。请求者就是最高指挥部(HighCommand),处理者有炮兵部队(Artillery)、导弹部队(MissileForce)、核部队(NuclearForce)。各部队对最高指挥部发出的攻击指令进行各自的处理。UML图如下:

interface.go文件:

package main

type Forces interface {
Execute(*HighCommand)
SetNext(Forces)
}

artillery.go文件:

package main

import "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 main

import "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 main

import "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 main

type EndChain struct{}

func (f *EndChain) Execute(command *HighCommand) {}

func (f *EndChain) SetNext(next Forces) {}

client.go文件:

package main

type HighCommand struct {
name string
}

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

main.go文件:

package main

func 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即可。

该例子运行结果为:

责任编辑:武晓燕 来源: 今日头条
相关推荐

2021-12-24 07:50:45

责任链模式设计

2012-03-28 13:28:56

Java设计模式

2024-06-04 13:11:52

Python行为设计模式开发

2024-12-03 15:52:45

责任链Java

2022-11-01 08:46:20

责任链模式对象

2010-04-01 09:10:03

PHP设计模式责任链模式

2021-07-14 10:08:30

责任链模式加工链

2024-01-30 13:15:00

设计模式责任链

2023-09-28 08:45:56

开源责任链模式

2021-06-05 17:59:00

责任链模式设计

2023-09-26 00:27:07

设计模式链接

2021-06-09 07:15:15

责任链模式涨薪

2021-05-25 09:00:52

责任链模式设计模式面试经历

2023-06-05 07:55:31

2009-03-16 15:55:21

Java责任链模式

2024-05-09 12:17:00

责任链设计模式

2020-11-17 09:32:57

设计模式责任链

2021-02-11 09:13:27

责任链模式业务

2021-08-14 08:17:49

Android设计模式OKHttp

2024-10-09 17:19:04

GoGolangKubernetes
点赞
收藏

51CTO技术栈公众号