GoLang職責鏈模式代碼實現(xiàn)介紹
1. 需求
實現(xiàn)一個工具能準確判斷英雄能秒人的技能傷害!方便開掛時選擇最優(yōu)技能,直接秒人,有的英雄現(xiàn)如今只有三個技能,但也不排除之后重做會有四個技能,要求實現(xiàn)簡單上手,易擴展!
技能 2 進來了
技能 2 滿足條件釋放 造成 9000 傷害
技能 3 進來了
技能 3 滿足條件釋放 造成 10000 傷害
2023/5/10 10:26:31 技能1,傷害7000有點低不太行啊!推薦你換其他技能
2023/5/10 10:26:31 技能1,傷害7000有點低不太行啊!推薦你換其他技能
職責: 判斷能秒人的傷害技能
鏈:技能鏈
Golang實現(xiàn)職責鏈模式時候,因為沒有繼承的支持,使用鏈對象包涵職責的方式,即:
- 鏈對象包含當前職責對象以及下一個職責鏈。
- 職責對象提供接口表示是否能處理對應請求。
- 職責對象提供處理函數處理相關職責。
2. 代碼實現(xiàn)
1. manager.go
下面是先定義一個職責鏈管理器,來幫助每個對象判斷它是否符合職責
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
給英雄技能一對象實現(xiàn)對應的職責
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
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
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
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職責鏈模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!