zoukankan      html  css  js  c++  java
  • 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()输出
    正在睡觉
    正在上班
    正在下班
    正在睡觉
    正在上班
    正在下班
    
  • 相关阅读:
    实验二、作业调度模拟实验
    实验一
    0909 初识操作系统
    实验四、主存空间的分配和回收模拟
    12.27评论5位同学试验三
    实验三进程调度模拟程序
    实验二、作业调度模拟实验
    实验一报告
    实验四 主存空间的分配和回收模拟
    实验三 进程调度模拟程序
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14126318.html
Copyright © 2011-2022 走看看