-
Notifications
You must be signed in to change notification settings - Fork 48
/
main.go
82 lines (67 loc) · 1.47 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// 命令模式(command pattern)主要解耦了行为和接收者,使之可以任意组合为一个完整的命令,并在合适的时候被调用
// 主要分为四个部分,command ,ConcreteCommand ,receiver ,invoker.
// 分别对应以下GameCommand ,(CommandAttack|CommandEscape) ,GamePlayer ,Invoker.
package main
// command
type GameCommand interface {
Execute()
}
// ConcreteCommand
type CommandAttack struct {Player GamePlayer}
func (c CommandAttack)Execute(){
c.Player.Attack()
}
// ConcreteCommand
type CommandEscape struct {Player GamePlayer}
func (c CommandEscape)Execute(){
c.Player.Escape()
}
// receiver
type GamePlayer interface {
Attack()
Escape()
}
type GunPlayer struct {Name string}
func (g GunPlayer) Attack() {
println(g.Name ,"opened fire")
}
func (g GunPlayer) Escape() {
println(g.Name ,"escape")
}
// invoker
type CommandInvoker struct {
CommandList chan GameCommand
}
func (in *CommandInvoker)CallCommands(){
for{
select {
case cmd := <- in.CommandList:
cmd.Execute()
default:
return
}
}
}
func (in *CommandInvoker)PushCommands(c ...GameCommand){
for _ ,v := range c{
in.CommandList <- v
}
}
func main(){
invoker := &CommandInvoker{
make(chan GameCommand ,10),
}
playerA := GunPlayer{"icg"}
attk := CommandAttack{playerA}
escp := CommandEscape{playerA}
invoker.PushCommands(attk ,escp ,escp ,attk ,escp)
invoker.CallCommands()
// output:
/*
icg opened fire
icg escape
icg escape
icg opened fire
icg escape
*/
}