状态模式(State Design Pattern)

状态模式经常应用于带有状态的对象中,类的行为是基于它的状态改变的,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变。

什么是状态?以常用的QQ为例,一般有这几种状态:

  • 在线
  • 离线
  • 正在登录中
  • 忙碌中

如何表示状态呢?一般会用枚举表示不同的状态,但是不同的状态需要处理不同的行为:

if state == ONLINE {
    //消息提醒
} else if state == BUSY {
    //回复忙碌中
} else ...

如果状态越多,需要处理的逻辑分支就越多。使用状态模式的目的就是为了把一大串的if...else...逻辑拆分到不同的状态类中,这样如果将来增加状态会更容易处理。

代码示例

package state

import "fmt"

type State int

const (
    UNKOWN State = iota
    ONLINE
    BUSY
)

type IState interface {
    ReceiveMessage(msg string)
}
type OnlineState struct {}

func (s OnlineState) ReceiveMessage(msg string) {
    fmt.Println("收到消息并提醒:", msg)
}

type BusyState struct {}

func (s BusyState) ReceiveMessage(msg string) {
    fmt.Println("回复忙碌中")
}

type StateContext struct {
    state IState
}

func (ctx *StateContext) SetState(s IState) {
    ctx.state = s
}

func (ctx StateContext) ReceiveMessage(msg string) {
    if msg == "online" {
        ctx.SetState(OnlineState{})
    }
    ctx.state.ReceiveMessage(msg)
}

调用:

onlineState := &OnlineState{}
ctx := &StateContext{}
ctx.SetState(onlineState)
ctx.ReceiveMessage("hello")

ctx.SetState(&BusyState{})
ctx.ReceiveMessage("hello")
ctx.ReceiveMessage("online")

// Output:
// 收到消息并提醒: hello
// 回复忙碌中
// 收到消息并提醒: online

results matching ""

    No results matching ""