• 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()输出
    正在睡觉
    正在上班
    正在下班
    正在睡觉
    正在上班
    正在下班
    
  • 相关阅读:
    框架学习之Spring 前言
    XML学习第二节 DTD介绍
    JavaScript重学 V512视频
    框架学习之Spring 第五节 SSH整合开发[Spring2.5+Hibernate3.3+Struts2]
    XML学习第一节 XML简介
    框架学习之Spring 第四节 Spring集成JDBC组件开发
    歌曲:酒干倘卖无 背后的故事
    又要被学校开除了!
    linux常用命令
    心情
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14126318.html
Copyright © 2020-2023  润新知