创建文件Week.go
package state // 每个星期行为 type Week interface { Today() Next(*DayContext) } // 星期数据结构 type DayContext struct { today Week } func NewDayContext() *DayContext { return &DayContext{&Sunday{}} } func (dc *DayContext) Today() { dc.today.Today() // 今天 } func (dc *DayContext) Next() { dc.today.Next(dc) // 明天 }
创建文件Day.go
package state import "fmt" type Sunday struct { } func (s *Sunday) Today() { fmt.Println("Sunday") } func (s *Sunday) Next(ctx *DayContext) { ctx.today = &Monday{} } type Monday struct { } func (s *Monday) Today() { fmt.Println("Monday") } func (s *Monday) Next(ctx *DayContext) { ctx.today = &Tuesday{} } type Tuesday struct { } func (s *Tuesday) Today() { fmt.Println("Tuesday") } func (s *Tuesday) Next(ctx *DayContext) { ctx.today = &Wednesday{} } type Wednesday struct { } func (s *Wednesday) Today() { fmt.Println("Wednesday") } func (s *Wednesday) Next(ctx *DayContext) { ctx.today = &Thursday{} } type Thursday struct { } func (s *Thursday) Today() { fmt.Println("Thursday") } func (s *Thursday) Next(ctx *DayContext) { ctx.today = &Friday{} } type Friday struct { } func (s *Friday) Today() { fmt.Println("Friday") } func (s *Friday) Next(ctx *DayContext) { ctx.today = &Saturday{} } type Saturday struct { } func (s *Saturday) Today() { fmt.Println("Saturday") } func (s *Saturday) Next(ctx *DayContext) { ctx.today = &Sunday{} }
main.go
package main import "test/design/state" func main() { ctx := state.NewDayContext() todayAndNext := func() { ctx.Today() ctx.Next() } for i := 0; i < 8; i++ { todayAndNext() } }