chain of responsibility

This commit is contained in:
nynicg 2019-05-02 08:00:01 +08:00
parent 450074a3d6
commit 821af9d44b
2 changed files with 116 additions and 0 deletions

View 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)
}

View 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
*/
}