add a game visitor

This commit is contained in:
Edward 2020-05-04 16:41:42 +08:00
parent 0c69fdb726
commit 7787fba31b
3 changed files with 109 additions and 11 deletions

View File

@ -1,8 +1,8 @@
# 访问者模式 # 访问者模式
访问者模式, 访问者模式,常常1对N的情况处理用于将数据结构和操作进行分离访问者模式侧重Visitor一侧而不是被访问的一侧可以方便的增加很多访问者而是不是增加更多的访问对象.
访问者模式的目的是为了解耦对象和对象的使用和处理逻辑,一边提供资源,一边使用,也可以说是解耦生产出来的产品和产品消费者 访问者模式的目的是为了解耦对象和对象的使用和处理逻辑,一边提供资源,一边使用,也可以说是解耦生产出来的产品和产品消费者,同样用于分离操作的还有策略模式(strategy pattern),但两者存在侧重点不同.
一个石油的例子油田提供石油不同的客户将石油用到不同的地方可能用于生产武器可能用于提纯材料生产服装也可能只是用于只是用于提供动力这些客户就是石油的不同visitor. 一个石油的例子油田提供石油不同的客户将石油用到不同的地方可能用于生产武器可能用于提纯材料生产服装也可能只是用于只是用于提供动力这些客户就是石油的不同visitor.

View File

@ -0,0 +1,84 @@
package visitor
import "fmt"
//IGameContext 游戏上下文
type IGameContext interface {
Accept(IGameVisitor)
}
//Player 代表其他玩家,因为用户角色需要和其他玩家交互
type Player struct {
Name string
Level int
}
//Accept 提供交互接口
func (p Player) Accept(v IGameVisitor) {
v.VisitPlayer(p)
}
//NPC 被方法对象
type NPC struct {
Name string
IsImmortal bool //是否可以被打死
}
//Accept 接受聚能NPC访问能力的对象的访问
func (n NPC) Accept(v IGameVisitor) {
v.VisitNPC(n)
}
//SystemEnv 环境对象
type SystemEnv struct {
Mark string //环境标识
Version string //环境版本
}
//Accept 提供对环境的访问
func (s SystemEnv) Accept(v IGameVisitor) {
v.VisitSystemEnv(s)
}
//IGameVisitor 游戏提供的环境访问能力
type IGameVisitor interface {
VisitPlayer(Player)
VisitNPC(NPC)
VisitSystemEnv(SystemEnv)
}
// SettingVisitor 只提供Setting的能力
type SettingVisitor struct{}
//VisitPlayer 提供交互的第三方对象的信息
func (SettingVisitor) VisitPlayer(p Player) {
fmt.Printf("Game Player: Name:%s ,Level:%d\n", p.Name, p.Level)
}
//VisitNPC 提供NPC的信息
func (SettingVisitor) VisitNPC(n NPC) {
fmt.Printf("Game NPC: Name:%s ,Immortal:%v\n", n.Name, n.IsImmortal)
}
//VisitSystemEnv 提供游戏环境信息
func (SettingVisitor) VisitSystemEnv(s SystemEnv) {
fmt.Printf("Game Env: Mark:%s ,Version:%s\n", s.Mark, s.Version)
}
// Attacker 攻击者
type Attacker struct{ name string }
//VisitPlayer 攻击其他玩家
func (a Attacker) VisitPlayer(p Player) {
fmt.Printf("%s Attack Player : %s\n", a.name, p.Name)
}
//VisitNPC 攻击NPC
func (a Attacker) VisitNPC(n NPC) {
fmt.Printf("%s Attack NPC: %s\n", a.name, n.Name)
}
//VisitSystemEnv 攻击环境,如石头,大门,墙壁
func (a Attacker) VisitSystemEnv(s SystemEnv) {
fmt.Printf("Unsupported target %s\n", "game env")
}

View File

@ -21,13 +21,27 @@ func TestVisitor(t *testing.T) {
} }
func ExampleAnalysis() { func TestGameVisitorsList(t *testing.T) {
c := &CustomerCol{}
c.Add(NewEnterpriseCustomer("A company")) retriveSetting := SettingVisitor{}
c.Add(NewIndividualCustomer("bob")) attacker := Attacker{}
c.Add(NewEnterpriseCustomer("B company"))
c.Accept(&AnalysisVisitor{}) pA := Player{"snow dance", 100} //角色名名snow dance 100级
// Output: pB := Player{"fire dragon", 120}
// analysis enterprise customer A company npc := NPC{"groceries", true} //卖杂货的NPC是能被打死的
// analysis enterprise customer B company env := SystemEnv{"made by china", "v1.2.11"}
//游戏对象
gameObjects := []IGameContext{pA, npc, env, pB}
for _, v := range gameObjects {
v.Accept(retriveSetting)
}
t.Log("\n---- attack- --")
for _, v := range gameObjects {
v.Accept(attacker)
}
} }