文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

责任链模式-Golang实现

2024-12-13 16:37

关注

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

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

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

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

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

下面来看代码实现:

我们来模拟最高指挥部对各个作战部队下达指令的情形。请求者就是最高指挥部(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即可。

该例子运行结果为:

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯