Golang设计模式之状态机模式

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

创建文件Week.go

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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) // 明天
}
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) // 明天 }
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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{}
}
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{} }
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package main
import "test/design/state"
func main() {
ctx := state.NewDayContext()
todayAndNext := func() {
ctx.Today()
ctx.Next()
}
for i := 0; i < 8; i++ {
todayAndNext()
}
}
package main import "test/design/state" func main() { ctx := state.NewDayContext() todayAndNext := func() { ctx.Today() ctx.Next() } for i := 0; i < 8; i++ { todayAndNext() } }
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