Skip to content

Commit 2f4f567

Browse files
committed
add state
1 parent 77e7b0a commit 2f4f567

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

16_state/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# 状态模式
2+
3+
状态模式用于分离状态和行为。

16_state/state.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package state
2+
3+
import "fmt"
4+
5+
type Week interface {
6+
Today()
7+
Next(*DayContext)
8+
}
9+
10+
type DayContext struct {
11+
today Week
12+
}
13+
14+
func NewDayContext() *DayContext {
15+
return &DayContext{
16+
today: &Sunday{},
17+
}
18+
}
19+
20+
func (d *DayContext) Today() {
21+
d.today.Today()
22+
}
23+
24+
func (d *DayContext) Next() {
25+
d.today.Next(d)
26+
}
27+
28+
type Sunday struct{}
29+
30+
func (*Sunday) Today() {
31+
fmt.Printf("Sunday\n")
32+
}
33+
34+
func (*Sunday) Next(ctx *DayContext) {
35+
ctx.today = &Monday{}
36+
}
37+
38+
type Monday struct{}
39+
40+
func (*Monday) Today() {
41+
fmt.Printf("Monday\n")
42+
}
43+
44+
func (*Monday) Next(ctx *DayContext) {
45+
ctx.today = &Tuesday{}
46+
}
47+
48+
type Tuesday struct{}
49+
50+
func (*Tuesday) Today() {
51+
fmt.Printf("Tuesday\n")
52+
}
53+
54+
func (*Tuesday) Next(ctx *DayContext) {
55+
ctx.today = &Wednesday{}
56+
}
57+
58+
type Wednesday struct{}
59+
60+
func (*Wednesday) Today() {
61+
fmt.Printf("Wednesday\n")
62+
}
63+
64+
func (*Wednesday) Next(ctx *DayContext) {
65+
ctx.today = &Thursday{}
66+
}
67+
68+
type Thursday struct{}
69+
70+
func (*Thursday) Today() {
71+
fmt.Printf("Thursday\n")
72+
}
73+
74+
func (*Thursday) Next(ctx *DayContext) {
75+
ctx.today = &Friday{}
76+
}
77+
78+
type Friday struct{}
79+
80+
func (*Friday) Today() {
81+
fmt.Printf("Friday\n")
82+
}
83+
84+
func (*Friday) Next(ctx *DayContext) {
85+
ctx.today = &Saturday{}
86+
}
87+
88+
type Saturday struct{}
89+
90+
func (*Saturday) Today() {
91+
fmt.Printf("Saturday\n")
92+
}
93+
94+
func (*Saturday) Next(ctx *DayContext) {
95+
ctx.today = &Sunday{}
96+
}

16_state/state_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package state
2+
3+
func ExampleWeek() {
4+
ctx := NewDayContext()
5+
ctx.Today()
6+
ctx.Next()
7+
ctx.Today()
8+
ctx.Next()
9+
ctx.Today()
10+
ctx.Next()
11+
ctx.Today()
12+
ctx.Next()
13+
ctx.Today()
14+
ctx.Next()
15+
ctx.Today()
16+
ctx.Next()
17+
ctx.Today()
18+
ctx.Next()
19+
ctx.Today()
20+
ctx.Next()
21+
// Output:
22+
// Sunday
23+
// Monday
24+
// Tuesday
25+
// Wednesday
26+
// Thursday
27+
// Friday
28+
// Saturday
29+
// Sunday
30+
}

0 commit comments

Comments
 (0)