diff --git a/behavioral/chain_of_responsibility/go_test.go b/behavioral/chain_of_responsibility/go_test.go new file mode 100644 index 0000000..536288c --- /dev/null +++ b/behavioral/chain_of_responsibility/go_test.go @@ -0,0 +1,42 @@ +package main + +import ( + "log" + "sync" + "testing" + "time" +) + +// 想弄清楚slice遍历时被修改到底会发生什么. +// 结果是安全失败. +// 并不意味着是线程安全的. +func TestGo(t *testing.T){ + s := make([]int ,0) + wg := &sync.WaitGroup{} + wg.Add(2) + for i:=0 ;i<10 ;i++{ + s = append(s, i) + } + + itv := time.Second + go func() { + defer wg.Done() + for k ,v := range s{ + println(k ,v) + time.Sleep(itv) + } + }() + + time.Sleep(itv) + + go func() { + defer wg.Done() + s = append(s ,810) + time.Sleep(itv) + s = append(s ,114) + log.Println("add") + }() + + wg.Wait() + log.Println(s) +} diff --git a/behavioral/chain_of_responsibility/main.go b/behavioral/chain_of_responsibility/main.go new file mode 100644 index 0000000..e88bc9a --- /dev/null +++ b/behavioral/chain_of_responsibility/main.go @@ -0,0 +1,74 @@ +package main + +type GameType int + +const ( + TypeFPS GameType = 1 + TypeRPG = TypeFPS << 1 +) + +type Game interface { + Type() GameType + Start(player string) +} + +// chain of responsibility +type GameSelector struct { + GameList []Game +} + +func (g *GameSelector)AddGame(games ...Game){ + g.GameList = append(g.GameList ,games...) +} + +func (g GameSelector) Start(t GameType, player string) { + for _ ,v := range g.GameList{ + if v.Type() == t{ + v.Start(player) + return + } + } +} + +type FPSGame struct { + t GameType +} + +func (f FPSGame) Start(player string) { + println(player ,"join in fps game") +} + +func (f FPSGame)Type() GameType{ + return f.t +} + +type RPGGame struct { + t GameType +} + +func (RPGGame) Start(player string) { + println(player ,"join in rpg game") +} + +func (r RPGGame)Type() GameType{ + return r.t +} + +func main(){ + fps := FPSGame{TypeFPS} + rpg := RPGGame{TypeRPG} + + sl := GameSelector{make([]Game ,0)} + sl.AddGame(fps ,rpg) + + player := "icg" + sl.Start(TypeRPG ,player) + println() + sl.Start(TypeFPS ,player) + // output: + /* + icg join in rpg game + + icg join in fps game + */ +}