Go设计模式之状态模式

93 阅读2分钟

状态模式是Go语言中的一种行为型设计模式。它允许对象在内部状态改变时改变它的行为,使得对象看起来似乎修改了它的类。

其中Context是对象,State是行为。对象根据自己的状态(State),对外表现不同的行为.

实现

首先需要定义一个State接口,以及不同的状态。例如:

type State interface {
    Handle(ctx *Context)
}

type InitialState struct{}

func (i *InitialState) Handle(ctx *Context) {
    // 操作一
    // 将Context的State切换为新的状态
    ctx.State = NextState
}

type NextState struct{}

func (n *NextState) Handle(ctx *Context) {
    // 操作二
    // 将Context的State切换为另一个新的状态
    ctx.State = ThirdState
}

type ThirdState struct{}

func (t *ThirdState) Handle(ctx *Context) {
    // 操作三
    // 将Context的State切换为另一个新的状态
    ctx.State = InitialState
}

这里定义了三种状态,当调用State的Handle方法时,它触发了不同的操作,然后将上下文的状态更改为下一个状态。

下面是上下文(Context)接口的定义:

type Context struct {
    State State
}

func (c *Context) Request() {
    c.State.Handle(c)
}

在Context接口中,我们需要将请求(Request)分配给当前的State。当请求调用Request方法时,将自动调用Handle方法,在 handle 方法中执行操作,并将状态切换到下一个状态。

来看一个完整的示例:

package main

import "fmt"

type State interface {
   Handle(ctx *Context)
}

type InitialState struct{}

func (i *InitialState) Handle(ctx *Context) {
   fmt.Println("现在是起始状态")
   // 切换到第二个状态
   ctx.State = &NextState{}
}

type NextState struct{}

func (n *NextState) Handle(ctx *Context) {
   fmt.Println("现在是第二个状态")
   // 切换到第三个状态
   ctx.State = &ThirdState{}
}

type ThirdState struct{}

func (t *ThirdState) Handle(ctx *Context) {
   fmt.Println("现在是第三个状态")
   // 切换到起始状态
   ctx.State = &InitialState{}
}

type Context struct {
   State State
}

func (c *Context) Request() {
   c.State.Handle(c)
}

func main() {
   ctx := &Context{State: &InitialState{}}

   // 执行第一次请求
   ctx.Request()
   // 执行第二次请求
   ctx.Request()
   // 执行第三次请求
   ctx.Request()
}

运行结果:

现在是起始状态
现在是第二个状态
现在是第三个状态

总结

状态模式可以使得对象在不同的状态下表现出不同的行为,而不需要改变对象的类。它可以被用于解决复杂的状态转换问题,但是也会增加一些额外的类。