模式定义
允许一个对象在其内部状态改变时改变它的行为,从而使对象看起来似乎修改了其行为
类图
要点总结
- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象,但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转化是原子性的--即要么彻底转化过来,要么不转换
- 如果State对象没有实例变量,那么各个上下文可以共享一个State对象,从而节省对象开销
Go语言代码实现
工程目录
State.go
package State
import "fmt"
type State interface {
On(m *Machine)
Off(m *Machine)
}
type Machine struct {
current State
}
func NewMachine() *Machine{
return &Machine{NewOff()}
}
func (m *Machine) setCurrent(s State) {
m.current = s
}
func (m * Machine) On() {
m.current.On(m)
}
func (m * Machine) Off() {
m.current.Off(m)
}
type ON struct {
}
func NewON() State{
return &ON{}
}
func (o *ON) On(m *Machine) {
fmt.Println("设备已经开启...")
}
func (o * ON) Off(m * Machine) {
fmt.Println("从On的状态到Off")
m.setCurrent(NewOff())
}
type OFF struct {
}
func NewOff() State{
return &OFF{}
}
func (o *OFF) On (m *Machine) {
fmt.Println("从Off状态到On")
m.setCurrent(NewON())
}
func (o * OFF) Off(m * Machine) {
fmt.Println("已经关闭")
}
State_test.go
package State
import "testing"
func TestState(t *testing.T) {
machine := NewMachine()
machine.Off()
machine.On()
machine.On()
machine.Off()
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。