php设计模式状态机,Golang设计模式之状态机模式

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值