关于设计模式:设计模式状态State模式

模式定义

容许一个对象在其外部状态扭转时扭转它的行为,从而使对象看起来仿佛批改了其行为

类图

要点总结

  • 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()
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理