DesignPatternState状态模式

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()输出
正在睡觉
正在上班
正在下班
正在睡觉
正在上班
正在下班
原文地址:https://www.cnblogs.com/maomaomaoge/p/14126318.html