1.什么是状态模式
状态模式主要解决当一个问题存在很多状态,并且处理操作会随着状态变化而变化,这是就可以使用状态模式,常见的使用状态模式的地方,比如将大量if else 抽象成一个个状态,然后使用状态模式解决。
2.状态模式讲解
- state是状态类,是一个interface,用来承接随着状态变化的子类, 并定义一个与状态相关的处理操作函数
- concreteState是状态子类,它会实现state定义的状态相关的处理操作函数, 每一个状态对应一个状态子类,随着状态的变化,当哪个子类赋给state状态类时,这个state就执行谁的方法
- context类,是concreteState的实例,主要包含成员就是状态和concreteState的实例本身,随着状态的变化,实例的状态就会变化
3.代码示例
- 代码结构图
- 代码示例
type Work struct {
hour int
current State
finish bool
}
func (w *Work) SetState(s State) {
w.current = s
}
func (w *Work) SetHour(hour int) {
w.hour = hour
}
func (w *Work) SetFinishState(finish bool) {
w.finish = finish
}
func (w Work) WriteProgram() {
w.current.WriteProgram(w)
}
type State interface {
WriteProgram(work Work)
}
type ForenoonState struct{}
func (fs ForenoonState) WriteProgram(work Work) {
if work.hour < 12 {
fmt.Println("上午")
} else {
work.SetState(NoonState{})
work.WriteProgram()
}
}
type NoonState struct{}
func (ns NoonState) WriteProgram(work Work) {
if work.hour < 13 {
fmt.Println("中午")
} else {
work.SetState(AfternoonState{})
work.WriteProgram()
}
}
type AfternoonState struct{}
func (as AfternoonState) WriteProgram(work Work) {
if work.hour < 17 {
fmt.Println("下午")
} else {
work.SetState(EveningState{})
work.WriteProgram()
}
}
type EveningState struct{}
func (es EveningState) WriteProgram(work Work) {
if work.finish {
work.SetState(RestState{})
work.WriteProgram()
} else {
if work.hour < 21 {
fmt.Println("晚间")
} else {
work.SetState(SleepingState{})
work.WriteProgram()
}
}
}
type SleepingState struct{}
func (ss SleepingState) WriteProgram(work Work) {
fmt.Println("睡着了")
}
type RestState struct{}
func (rs RestState) WriteProgram(work Work) {
fmt.Println("下班回家")
}
func main() {
tWork := new(Work)
tState := new(ForenoonState)
tWork.SetState(tState)
tWork.SetFinishState(true)
tWork.SetHour(12)
tWork.WriteProgram()
}
3.状态模式的用处与好处
1.好处
这样对于特定的状态的处理行为都在特定的concreteState类中,这样新增状态或者减少状态,只需套增删concreteState类,减少状态之间依赖
2.用处
当一个对象的操作行为取决于他的状态,并且他必须在程序运行时根据状态来选择他的行为,那么就可以使用状态模式