创建文件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()
}
}