欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GoLang職責鏈模式代碼實現(xiàn)介紹

 更新時間:2023年05月10日 11:23:26   作者:未來誰可知  
這篇文章主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Go語言中接口應用模式或慣例介紹

    詳解Go語言中接口應用模式或慣例介紹

    這篇文章主要為大家詳細介紹了Go語言中接口應用模式或慣例介紹的相關知識,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • Go高級特性探究之優(yōu)先級隊列詳解

    Go高級特性探究之優(yōu)先級隊列詳解

    Heap?是一種數據結構,這種數據結構常用于實現(xiàn)優(yōu)先隊列,這篇文章主要就是來和大家深入探討一下GO語言中的優(yōu)先級隊列,感興趣的可以了解一下
    2023-06-06
  • 在Golang中實現(xiàn)RSA算法的加解密操作詳解

    在Golang中實現(xiàn)RSA算法的加解密操作詳解

    RSA 是一種非對稱加密算法,廣泛使用于數據的安全傳輸,crypto/rsa 是 Golang 中實現(xiàn)了 RSA 算法的一個標準庫,提供了生成公私鑰對、加解密數據、簽名和驗簽等功能,本文給大家介紹了在Golang中實現(xiàn)RSA算法的加解密操作,需要的朋友可以參考下
    2023-12-12
  • golang進行簡單權限認證的實現(xiàn)

    golang進行簡單權限認證的實現(xiàn)

    本文主要介紹了golang簡單權限認證的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語言JSON解析器gjson使用方法詳解

    Go語言JSON解析器gjson使用方法詳解

    這篇文章主要介紹了Go語言json解析框架與gjson,JSON?解析是我們不可避免的常見問題,在Go語言中,我們可以借助gjson庫來方便的進行json屬性的提取與解析,需要的朋友可以參考一下
    2022-12-12
  • 詳解如何利用Golang泛型提高編碼效率

    詳解如何利用Golang泛型提高編碼效率

    Golang的泛型已經出來有一段時間了,大家應該或多或少對它有所了解。雖然Golang的泛型在功能上確實比較簡單,而且確實可能會增加代碼的復雜度,過度使用可能還會降低代碼可讀性。本文就來介紹一下Golang泛型的相關知識吧
    2023-04-04
  • 詳解golang中模板的常用語法

    詳解golang中模板的常用語法

    這篇文章主要介紹了golang模板中的常用語法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • golang 的string與[]byte轉換方式

    golang 的string與[]byte轉換方式

    這篇文章主要介紹了golang 的string與[]byte轉換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中的Iota關鍵字

    Go語言中的Iota關鍵字

    這篇文章介紹了Go語言中的Iota關鍵字,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • go嵌套匿名結構體的初始化詳解

    go嵌套匿名結構體的初始化詳解

    這篇文章主要介紹了go嵌套匿名結構體的初始化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論