首页
读书
网课

正文

状态模式

状态模式用于分离状态和行为。


state.go

package state


import "fmt"


type Week interface {

    Today()

    Next(*DayContext)

}


type DayContext struct {

    today Week

}


func NewDayContext() *DayContext {

    return &DayContext{

        today: &Sunday{},

    }

}


func (d *DayContext) Today() {

    d.today.Today()

}


func (d *DayContext) Next() {

    d.today.Next(d)

}


type Sunday struct{}


func (*Sunday) Today() {

    fmt.Printf("Sunday\n")

}


func (*Sunday) Next(ctx *DayContext) {

    ctx.today = &Monday{}

}


type Monday struct{}


func (*Monday) Today() {

    fmt.Printf("Monday\n")

}


func (*Monday) Next(ctx *DayContext) {

    ctx.today = &Tuesday{}

}


type Tuesday struct{}


func (*Tuesday) Today() {

    fmt.Printf("Tuesday\n")

}


func (*Tuesday) Next(ctx *DayContext) {

    ctx.today = &Wednesday{}

}


type Wednesday struct{}


func (*Wednesday) Today() {

    fmt.Printf("Wednesday\n")

}


func (*Wednesday) Next(ctx *DayContext) {

    ctx.today = &Thursday{}

}


type Thursday struct{}


func (*Thursday) Today() {

    fmt.Printf("Thursday\n")

}


func (*Thursday) Next(ctx *DayContext) {

    ctx.today = &Friday{}

}


type Friday struct{}


func (*Friday) Today() {

    fmt.Printf("Friday\n")

}


func (*Friday) Next(ctx *DayContext) {

    ctx.today = &Saturday{}

}


type Saturday struct{}


func (*Saturday) Today() {

    fmt.Printf("Saturday\n")

}


func (*Saturday) Next(ctx *DayContext) {

    ctx.today = &Sunday{}

}

state_test.go

package state


func ExampleWeek() {

    ctx := NewDayContext()

    todayAndNext := func() {

        ctx.Today()

        ctx.Next()

    }


    for i := 0; i < 8; i++ {

        todayAndNext()

    }

    // Output:

    // Sunday

    // Monday

    // Tuesday

    // Wednesday

    // Thursday

    // Friday

    // Saturday

    // Sunday

}



上一篇: 没有了
下一篇: 没有了
圣贤书院