模式定义
容许一个对象在其外部状态扭转时扭转它的行为,从而使对象看起来仿佛批改了其行为
类图
要点总结
- State模式将所有与一个特定状态相干的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象,但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且能够保障不会呈现状态不统一的状况,因为转化是原子性的--即要么彻底转化过去,要么不转换
- 如果State对象没有实例变量,那么各个上下文能够共享一个State对象,从而节俭对象开销
Go语言代码实现
工程目录
State.go
package Stateimport "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 Stateimport "testing"func TestState(t *testing.T) { machine := NewMachine() machine.Off() machine.On() machine.On() machine.Off()}