Golang设计模式之状态机模式

Jackey Golang 3,200 次浏览 , , 没有评论

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

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go