-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathstate.go
More file actions
116 lines (93 loc) · 2.16 KB
/
Copy pathstate.go
File metadata and controls
116 lines (93 loc) · 2.16 KB
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package state
import "fmt"
// 状态接口:定义通用的状态规范标准.
type State interface {
ToGreen(light *TrafficLight)
ToYellow(light *TrafficLight)
ToRed(light *TrafficLight)
}
// 定义一个交通信号灯.
type TrafficLight struct {
state State
}
// 创建一个交通信号灯,并初始化状态为红灯.
func NewTrafficLight() *TrafficLight {
return &TrafficLight{
state: NewRed(),
}
}
// 设置状态
func (t *TrafficLight) SetState(state State) {
t.state = state
}
// 转换为绿灯
func (t *TrafficLight) ToGreen() {
t.state.ToGreen(t)
}
// 转换为黄灯
func (t *TrafficLight) ToYellow() {
t.state.ToYellow(t)
}
// 转换为红灯
func (t *TrafficLight) ToRed() {
t.state.ToRed(t)
}
// 定义一个红灯
type Red struct{}
// 创建一个红灯实例
func NewRed() *Red {
return &Red{}
}
// 转换为绿灯
func (r *Red) ToGreen(light *TrafficLight) {
fmt.Println("错误,红灯不可以切换为绿灯!")
}
// 转换为黄灯
func (r *Red) ToYellow(light *TrafficLight) {
fmt.Println("黄灯亮起 5 秒!")
light.SetState(NewYellow())
}
// 转换为红灯
func (r *Red) ToRed(light *TrafficLight) {
fmt.Println("错误,已经是红灯!")
}
// 定义一个黄灯
type Yellow struct{}
// 创建一个黄灯实例
func NewYellow() *Yellow {
return &Yellow{}
}
// 转换为绿灯
func (y Yellow) ToGreen(light *TrafficLight) {
fmt.Println("绿灯亮起 5 秒!")
light.SetState(NewGreen())
}
// 转换为黄灯
func (y Yellow) ToYellow(light *TrafficLight) {
fmt.Println("错误,已经是黄灯!")
}
// 转换为红灯
func (y Yellow) ToRed(light *TrafficLight) {
fmt.Println("红灯亮起 5 秒!")
light.SetState(NewRed())
}
// 定义一个绿灯
type Green struct{}
// 创建一个绿灯实例
func NewGreen() *Green {
return &Green{}
}
// 转换为绿灯
func (g *Green) ToGreen(light *TrafficLight) {
fmt.Println("错误,已经是绿灯!")
}
// 转换为黄灯
func (g *Green) ToYellow(light *TrafficLight) {
fmt.Println("黄灯亮起 5 秒!")
light.SetState(NewYellow())
}
// 转换为红灯
func (g *Green) ToRed(light *TrafficLight) {
fmt.Println("红灯亮起 5 秒!")
light.SetState(NewRed())
}