状态模式(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