脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - GoLang职责链模式代码实现介绍

GoLang职责链模式代码实现介绍

2023-05-11 14:26未来谁可知 Golang

这篇文章主要介绍了GoLang职责链模式代码实现,职责链模式是一种常用的设计模式,可以提高代码的灵活性与可维护性,职责链模式将请求和处理分离,可以让请求在处理链中依次经过多个处理者,直到找到能够处理请求的处理者

1. 需求

实现一个工具能准确判断英雄能秒人的技能伤害!方便开挂时选择最优技能,直接秒人,有的英雄现如今只有三个技能,但也不排除之后重做会有四个技能,要求实现简单上手,易扩展!

技能 2 进来了
技能 2 满足条件释放 造成 9000 伤害
技能 3 进来了
技能 3 满足条件释放 造成 10000 伤害
2023/5/10 10:26:31 技能1,伤害7000有点低不太行啊!推荐你换其他技能
2023/5/10 10:26:31 技能1,伤害7000有点低不太行啊!推荐你换其他技能

职责: 判断能秒人的伤害技能

链:技能链

Golang实现职责链模式时候,因为没有继承的支持,使用链对象包涵职责的方式,即:

  • 链对象包含当前职责对象以及下一个职责链。
  • 职责对象提供接口表示是否能处理对应请求。
  • 职责对象提供处理函数处理相关职责。

2. 代码实现

1. manager.go

下面是先定义一个职责链管理器,来帮助每个对象判断它是否符合职责

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
import "log"
// 职责链模式
type Manager interface {
    HaveKill(attack int) bool                         // 是否击杀
    HandleAttackRequest(skillId int, attack int) bool // 连招
}
// 连招
type SkillChain struct {
    Manager
    successor *SkillChain
}
func (r *SkillChain) SetSuccessor(m *SkillChain) {
    r.successor = m
}
func (r *SkillChain) HandleAttackRequest(skillId int, attack int) bool {
    // 伤害是否满足击杀
    if r.Manager.HaveKill(attack) {
        return r.Manager.HandleAttackRequest(skillId, attack) // 释放连招把并且播报
    }
    if r.successor != nil {
        log.Printf("技能%d,伤害%d有点低不太行啊!推荐你换其他技能\n", skillId, attack)
        return r.successor.HandleAttackRequest(skillId, attack)
    }
    return false
}
func (r *SkillChain) HaveKill(attack int) bool {
    return true
}

2. skill1_manager.go

给英雄技能一对象实现对应的职责

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
import (
    "fmt"
)
const (
    Hp = 8000
    SkillOne =1
    SkillTwo =2
    SkillThree =3
)
type SkillOneManager struct {
}
func NewSkillOneManager() *SkillChain {
    return &SkillChain{
        Manager:&SkillOneManager{},
    }
}
func (s SkillOneManager) HaveKill(attack int) bool {
    return attack>Hp
}
func (s SkillOneManager) HandleAttackRequest(skillId int, attack int) bool {
    fmt.Printf("技能 %d 进来了\n",skillId)
    if skillId==SkillOne{
        fmt.Printf("技能 %d满足条件释放 造成 %d 伤害\n", skillId, attack)
        return true
    }
    fmt.Printf("技能 %d 满足条件释放 造成 %d 伤害\n", skillId, attack)
    return false
}

3. skill2_manager.go

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
import (
    "fmt"
)
type SkillTwoManager struct {}
func NewSkillTwoManager() *SkillChain {
    return &SkillChain{
        Manager:&SkillTwoManager{},
    }
}
func (s SkillTwoManager) HaveKill(attack int) bool {
    return attack>Hp
}
func (s SkillTwoManager) HandleAttackRequest(skillId int, attack int) bool {
    if skillId==SkillTwo{
        fmt.Printf("技能 %d 满足条件释放 造成 %d 伤害\n", skillId, attack)
        return true
    }
    fmt.Printf("技能 %d不 满足条件释放 造成 %d 伤害\n", skillId, attack)
    return false
}

4. skill3_manager.go

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import (
    "fmt"
)
type SkillThreeManager struct {
}
func NewSkillThreeManager() *SkillChain {
    return &SkillChain{
        Manager:&SkillThreeManager{},
    }
}
func (s SkillThreeManager) HaveKill(attack int) bool {
    return attack>Hp
}
func (s SkillThreeManager) HandleAttackRequest(skillId int, attack int) bool {
    if skillId==SkillThree{
        fmt.Printf("技能 %d 满足条件释放 造成 %d 伤害\n", skillId, attack)
        return true
    }
    fmt.Printf("技能 %d不 满足条件释放 造成 %d 伤害\n", skillId, attack)
    return false
}

5. mian.go

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
type (
    HeroId  = int
    SkillId = int
    Attack  = int
)
type DaJi struct {
    HeroId    HeroId
    Name      string
    SkillInfo map[SkillId]Attack
}
func NewDaJi(skillInfo map[SkillId]Attack) *DaJi {
    return &DaJi{HeroId: 1, Name: "妲己", SkillInfo: skillInfo}
}
func main() {
    c1 := NewSkillOneManager()
    c2 := NewSkillTwoManager()
    c3 := NewSkillThreeManager()
    c1.SetSuccessor(c2)
    c2.SetSuccessor(c3)
    var c Manager = c1
    skillInfo := make(map[SkillId]Attack, 3)
    skillInfo[SkillOne] = 7000  // 技能一  伤害
    skillInfo[SkillTwo] = 9000  // 技能一  伤害
    skillInfo[SkillThree] = 10000 // 大招  伤害
    daji:=NewDaJi(skillInfo)
    c.HandleAttackRequest(SkillOne, daji.SkillInfo[SkillOne])
    c.HandleAttackRequest(SkillTwo, daji.SkillInfo[SkillTwo])
    c.HandleAttackRequest(SkillThree, daji.SkillInfo[SkillThree])
}

总结

职责链模式算是迭代器模式的一个延伸,里面的思想与迭代器模式有些相似之处。迭代器是把队列每个元素作为输入,然后用户自己定义处理逻辑,而职责链是用户指定多个处理逻辑,处理同一个输入,只有满足条件的那个处理逻辑才能真正输出,而其他处理逻辑只是把输入传递给下一个处理逻辑。

到此这篇关于GoLang职责链模式分离组合职责的文章就介绍到这了,更多相关GoLang职责链模式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/jiohfgj/article/details/122257802

延伸 · 阅读

精彩推荐
  • GolangGoLang channel使用介绍

    GoLang channel使用介绍

    Channel 和 goroutine 的结合是 Go 并发编程的大杀器。而 Channel 的实际应用也经常让人眼前一亮,通过与 select,cancel,timer 等结合,它能实现各种各样的功能。...

    ~庞贝11712022-11-27
  • Golang深入探究Golang中log标准库的使用

    深入探究Golang中log标准库的使用

    Go 语言标准库中的 log 包设计简洁明了,易于上手,可以轻松记录程序运行时的信息、调试错误以及跟踪代码执行过程中的问题等。本文主要来深入探究 ...

    江湖十年8482023-05-07
  • Golangwin10下安装Go和Goland的详细教程

    win10下安装Go和Goland的详细教程

    这篇文章主要介绍了win10下安装Go和Goland的详细教程,本文给大家提到了go和golang之间的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参...

    Jason_Bourne_20492021-02-20
  • Golanggolang 归并排序,快速排序,堆排序的实现

    golang 归并排序,快速排序,堆排序的实现

    本文主要介绍了golang 归并排序,快速排序,堆排序的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    李晨毅11252022-08-31
  • GolangGolang 编译成DLL文件的操作

    Golang 编译成DLL文件的操作

    这篇文章主要介绍了Golang 编译成DLL文件的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    冷月醉雪7652021-06-20
  • GolangGolang切片删除指定元素的三种方法对比

    Golang切片删除指定元素的三种方法对比

    Go语言并没有提供用于删除元素的语法或接口,而是通过利用切片本身的特性来删除元素—追加元素,这篇文章主要给大家介绍了关于Golang切片删除指定元素的...

    恋喵大鲤鱼10062022-10-26
  • Golang基于golang如何实现error工具包详解

    基于golang如何实现error工具包详解

    Go 语言使用 error 类型来返回函数执行过程中遇到的错误,下面这篇文章主要给大家介绍了关于如何基于golang实现error工具包的相关资料,文中通过示例代码...

    zcv85752020-05-19
  • GolangGo语言多人聊天室项目实战

    Go语言多人聊天室项目实战

    这篇文章主要为大家详细介绍了Go语言多人聊天室项目实战,实现单撩或多撩等多种功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    尹成4562020-05-27