mirror of
https://github.com/crazybber/awesome-patterns.git
synced 2025-02-16 13:43:13 +03:00
chain of responsibility
This commit is contained in:
parent
450074a3d6
commit
821af9d44b
42
behavioral/chain_of_responsibility/go_test.go
Normal file
42
behavioral/chain_of_responsibility/go_test.go
Normal file
@ -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)
|
||||||
|
}
|
74
behavioral/chain_of_responsibility/main.go
Normal file
74
behavioral/chain_of_responsibility/main.go
Normal file
@ -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
|
||||||
|
*/
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user