最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年05月10日 11:23:26   作者:未來(lái)誰(shuí)可知  
這篇文章主要介紹了GoLang職責(zé)鏈模式代碼實(shí)現(xiàn),職責(zé)鏈模式是一種常用的設(shè)計(jì)模式,可以提高代碼的靈活性與可維護(hù)性,職責(zé)鏈模式將請(qǐng)求和處理分離,可以讓請(qǐng)求在處理鏈中依次經(jīng)過(guò)多個(gè)處理者,直到找到能夠處理請(qǐng)求的處理者為止

1. 需求

實(shí)現(xiàn)一個(gè)工具能準(zhǔn)確判斷英雄能秒人的技能傷害!方便開(kāi)掛時(shí)選擇最優(yōu)技能,直接秒人,有的英雄現(xiàn)如今只有三個(gè)技能,但也不排除之后重做會(huì)有四個(gè)技能,要求實(shí)現(xiàn)簡(jiǎn)單上手,易擴(kuò)展!

技能 2 進(jìn)來(lái)了
技能 2 滿足條件釋放 造成 9000 傷害
技能 3 進(jìn)來(lái)了
技能 3 滿足條件釋放 造成 10000 傷害
2023/5/10 10:26:31 技能1,傷害7000有點(diǎn)低不太行啊!推薦你換其他技能
2023/5/10 10:26:31 技能1,傷害7000有點(diǎn)低不太行啊!推薦你換其他技能

職責(zé): 判斷能秒人的傷害技能

鏈:技能鏈

Golang實(shí)現(xiàn)職責(zé)鏈模式時(shí)候,因?yàn)闆](méi)有繼承的支持,使用鏈對(duì)象包涵職責(zé)的方式,即:

  • 鏈對(duì)象包含當(dāng)前職責(zé)對(duì)象以及下一個(gè)職責(zé)鏈。
  • 職責(zé)對(duì)象提供接口表示是否能處理對(duì)應(yīng)請(qǐng)求。
  • 職責(zé)對(duì)象提供處理函數(shù)處理相關(guān)職責(zé)。

2. 代碼實(shí)現(xiàn)

1. manager.go

下面是先定義一個(gè)職責(zé)鏈管理器,來(lái)幫助每個(gè)對(duì)象判斷它是否符合職責(zé)

package main
import "log"
// 職責(zé)鏈模式
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) // 釋放連招把并且播報(bào)
	}
	if r.successor != nil {
		log.Printf("技能%d,傷害%d有點(diǎn)低不太行啊!推薦你換其他技能\n", skillId, attack)
		return r.successor.HandleAttackRequest(skillId, attack)
	}
	return false
}
func (r *SkillChain) HaveKill(attack int) bool {
	return true
}

2. skill1_manager.go

給英雄技能一對(duì)象實(shí)現(xiàn)對(duì)應(yīng)的職責(zé)

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 進(jìn)來(lái)了\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])
}

總結(jié)

職責(zé)鏈模式算是迭代器模式的一個(gè)延伸,里面的思想與迭代器模式有些相似之處。迭代器是把隊(duì)列每個(gè)元素作為輸入,然后用戶自己定義處理邏輯,而職責(zé)鏈?zhǔn)怯脩糁付ǘ鄠€(gè)處理邏輯,處理同一個(gè)輸入,只有滿足條件的那個(gè)處理邏輯才能真正輸出,而其他處理邏輯只是把輸入傳遞給下一個(gè)處理邏輯。

到此這篇關(guān)于GoLang職責(zé)鏈模式分離組合職責(zé)的文章就介紹到這了,更多相關(guān)GoLang職責(zé)鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang實(shí)現(xiàn)簡(jiǎn)易的rpc調(diào)用

    Golang實(shí)現(xiàn)簡(jiǎn)易的rpc調(diào)用

    RPC指(Remote Procedure Call Protocol)遠(yuǎn)程過(guò)程調(diào)用協(xié)議。本文將實(shí)現(xiàn)利用Golang進(jìn)行rpc調(diào)用(只實(shí)現(xiàn)一個(gè)rpc框架基本的功能,不對(duì)性能做保證),需要的可以參考一下
    2023-03-03
  • 使用Golang創(chuàng)建單獨(dú)的WebSocket會(huì)話

    使用Golang創(chuàng)建單獨(dú)的WebSocket會(huì)話

    WebSocket是一種在Web開(kāi)發(fā)中非常常見(jiàn)的通信協(xié)議,它提供了雙向、持久的連接,適用于實(shí)時(shí)數(shù)據(jù)傳輸和實(shí)時(shí)通信場(chǎng)景,本文將介紹如何使用 Golang 創(chuàng)建單獨(dú)的 WebSocket 會(huì)話,包括建立連接、消息傳遞和關(guān)閉連接等操作,需要的朋友可以參考下
    2023-12-12
  • 解決Go語(yǔ)言中高頻次和高并發(fā)下隨機(jī)數(shù)重復(fù)的問(wèn)題

    解決Go語(yǔ)言中高頻次和高并發(fā)下隨機(jī)數(shù)重復(fù)的問(wèn)題

    在Golang中,獲取隨機(jī)數(shù)的方法一般會(huì)介紹有兩種,一種是基于math/rand的偽隨機(jī),一種是基于crypto/rand的真隨機(jī),math/rand由于其偽隨機(jī)的原理,經(jīng)常會(huì)出現(xiàn)重復(fù)的隨機(jī)數(shù),導(dǎo)致在需要進(jìn)行隨機(jī)的業(yè)務(wù)出現(xiàn)較多的重復(fù)問(wèn)題,所以本文給大家介紹了較好的解放方案
    2023-12-12
  • Golang JSON的進(jìn)階用法實(shí)例講解

    Golang JSON的進(jìn)階用法實(shí)例講解

    這篇文章主要給大家介紹了關(guān)于Golang JSON進(jìn)階用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Go語(yǔ)言里切片slice的用法介紹

    Go語(yǔ)言里切片slice的用法介紹

    這篇文章介紹了Go語(yǔ)言里切片slice的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • golang判斷net.Conn 是否已關(guān)閉的操作

    golang判斷net.Conn 是否已關(guān)閉的操作

    這篇文章主要介紹了golang判斷net.Conn 是否已關(guān)閉的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go錯(cuò)誤處理的幾種方式

    Go錯(cuò)誤處理的幾種方式

    在Go語(yǔ)言中,錯(cuò)誤處理是一種重要的編程模式,它用于處理可能出現(xiàn)的錯(cuò)誤或異常情況,本文就來(lái)介紹一下Go錯(cuò)誤處理的幾種方式,感興趣的可以了解一下
    2023-11-11
  • go語(yǔ)言中的協(xié)程詳解

    go語(yǔ)言中的協(xié)程詳解

    本文詳細(xì)講解了go語(yǔ)言中的協(xié)程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang coroutine 的等待與死鎖用法

    golang coroutine 的等待與死鎖用法

    這篇文章主要介紹了golang coroutine 的等待與死鎖用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang實(shí)現(xiàn)java uuid的序列化方法

    golang實(shí)現(xiàn)java uuid的序列化方法

    這篇文章主要介紹了golang實(shí)現(xiàn)java uuid的序列化方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

巢湖市| 金川县| 三穗县| 永善县| 巍山| 维西| 天水市| 静宁县| 探索| 文昌市| 伊金霍洛旗| 临城县| 西畴县| 虞城县| 延川县| 平原县| 同仁县| 武邑县| 临高县| 西贡区| 高青县| 博野县| 昌乐县| 平顶山市| 鄂州市| 涿州市| 临武县| 涟源市| 桑植县| 昂仁县| 永和县| 宿松县| 佛山市| 临武县| 富源县| 沾益县| 凭祥市| 衡东县| 太和县| 江北区| 霍林郭勒市|