DesignPatternState状态模式
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
UML
- Context(环境类):维护一个ConcreteState子类的实例,这个实例定义当前的状态
- State(抽象状态类):定义一个接口以封装与Context的一个特定状态相关的行为
- ConcreteState(具体状态类):每一个子类实现一个与Context的一个状态相关的行为
实际案例
场景模拟
- 一个人的一天生活随着时间变化
- 上班 - 下班 - 睡觉 -上班
UML
代码实现
package my
import (
"fmt"
)
type State interface {
WorkNow()
WorkNext(wc *WorkContext)
}
type OnDuty struct {}
func NewOnDuty() *OnDuty {
return &OnDuty{}
}
func (od *OnDuty) WorkNext(wc *WorkContext) {
wc.SetState(NewOffDuty())
}
func (od *OnDuty) WorkNow() {
fmt.Println("正在上班")
}
type OffDuty struct {}
func NewOffDuty() *OffDuty {
return &OffDuty{}
}
func (od *OffDuty) WorkNext(wc *WorkContext) {
wc.SetState(NewSleep())
}
func (od *OffDuty) WorkNow() {
fmt.Println("正在下班")
}
type Sleep struct {}
func NewSleep() *Sleep {
return &Sleep{}
}
func (s *Sleep) WorkNext(wc *WorkContext) {
wc.SetState(NewOnDuty())
}
func (s *Sleep) WorkNow() {
fmt.Println("正在睡觉")
}
type WorkContext struct {
state State
}
func NewWorkContext() *WorkContext {
return &WorkContext{
state:NewSleep(),
}
}
func (wc *WorkContext) WorkNext() {
wc.state.WorkNext(wc)
}
func (wc *WorkContext) SetState(s State) {
wc.state = s
}
func TTmain() {
context := NewWorkContext()
for i := 0; i <= 5; i++ {
context.state.WorkNow()
context.WorkNext()
}
}
# 测试TTmain()输出
正在睡觉
正在上班
正在下班
正在睡觉
正在上班
正在下班