From 1e31d93f6077f5b6d750a1064a46fa3b71206d61 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 4 May 2020 01:10:46 +0800 Subject: [PATCH] add a game exampe for chain_of_responsibility --- .../responsibility_chain_game_test.go | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 behavior/06_chain_of_responsibility/responsibility_chain_game_test.go diff --git a/behavior/06_chain_of_responsibility/responsibility_chain_game_test.go b/behavior/06_chain_of_responsibility/responsibility_chain_game_test.go new file mode 100644 index 0000000..324b0a2 --- /dev/null +++ b/behavior/06_chain_of_responsibility/responsibility_chain_game_test.go @@ -0,0 +1,75 @@ +package chain + +import "testing" + +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 TestChainsOfResponsibilityInGame(t *testing.T) { + fps := FPSGame{TypeFPS} + rpg := RPGGame{TypeRPG} + + sl := GameSelector{} + 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 + */ +}