`
dadadada2x
  • 浏览: 9918 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式之State(状态模式)浅析

 
阅读更多
这个是照着一篇文章实现的ruby版。文章链接
http://blog.csdn.net/shuangde800/article/details/10132825?reload
#encoding: utf-8
class State
  #封装四种动作
  def insertQuarter ;end #投币
  def ejectQuarter ;end  #退币 
  def turnCrank ;end     #转动摇柄
  def dispense ;end      #发糖果
end


#没有投币的状态
class NoQuarterState < State
  def initialize(gumballMachine)
      @gumballMachine = gumballMachine
  end
  
  def insertQuarter
    p "你插入一枚硬币"
    p @gumballMachine.setState(@gumballMachine.getHasQuarterState)
  end
  
  def ejectQuarter
    p "你没有插入任何硬币"
  end
  
  def turnCrank
    p "你转动手柄,但是没有硬币插入"
  end
  
  def dispense
    p "首先你需要付钱"
  end
  
  def toString()
    return "等待插入硬币"
  end
end



#已经投币的状态 
class HasQuarterState < State
  def initialize(gumballMachine)
      @gumballMachine = gumballMachine
  end
  
  def insertQuarter
    p "你不能在插入别的硬币"
  end
  
  def ejectQuarter
    p "硬币吐出"
    @gumballMachine.setState(@gumballMachine.getNoQuarterState);  
  end
  
  def turnCrank
    p "你转动手柄..."
    @gumballMachine.setState(@gumballMachine.getSoldState)
  end
  
  def dispense
    p "没有糖果发放"
  end
  
  def toString()
    return "等待转动手柄"
  end
end


#正在售出的状态
class SoldState < State
  def initialize(gumballMachine)
      @gumballMachine = gumballMachine
  end
  
  def insertQuarter
    p "请等待,将要给你糖果"
  end
  
  def ejectQuarter
    p "对不起,你已经转过手柄"
  end
  
  def turnCrank
    p "转动两次不会给你多余的糖果"
  end
  
  def dispense
    @gumballMachine.releaseBall
    if @gumballMachine.getCount>0
      @gumballMachine.setState(@gumballMachine.getNoQuarterState)
    else
      p "哦no,已经没有糖果了"  
      @gumballMachine.setState(@gumballMachine.getSoldOutState)
    end
  end
  
  def toString()
    return "等待转动手柄"
  end
end


#卖完状态
class SoldOutState < State
  def initialize(gumballMachine)
      @gumballMachine = gumballMachine
  end
  
  def insertQuarter
    p "请等待,将要给你糖果"
    p @gumballMachine
  end
  
  def ejectQuarter
    p "对不起,你已经转过手柄"
  end
  
  def turnCrank
    p "转动两次不会给你多余的糖果,或者糖果卖完了"
  end
  
  def dispense
    p "没有糖果发放"
  end
  
  def toString()
    return "等待转动手柄"
  end
end


class GumballMachine   
   def initialize(numberGumballs)
     @soldOutState = SoldOutState.new(self)
     @noQuarterState = NoQuarterState.new(self)
     @hasQuarterState = HasQuarterState.new(self)  
     @soldState = SoldState.new(self)
     @count = numberGumballs
     if numberGumballs > 0
       @state = @noQuarterState
     end
   end
   
   def insertQuarter
     @state.insertQuarter
   end
   
   def ejectQuarter
     @state.ejectQuarter
   end
   
   def turnCrank
     @state.turnCrank
     @state.dispense  
   end
   
   def setState(state)
     @state=state
   end
   
   def releaseBall
     p "糖果正在给你..."
     if @count!=0
       @count = @count - 1
     end
   end
   
   def getCount
     @count
   end
   
   def refill(count)
     @count = count
     @state = @noQuarterState
   end
   
   def getState
     @state
   end
   
   def getSoldOutState
     @soldOutState
   end
   
   def getNoQuarterState
     @noQuarterState
   end
   
   def getHasQuarterState
     @hasQuarterState
   end
   
   def getSoldState
     @soldState
   end
end


#测试
@test = GumballMachine.new(5)
@test.insertQuarter  
@test.turnCrank  
p @test  
@test.insertQuarter  
@test.turnCrank
@test.insertQuarter  
@test.turnCrank
p @test  
分享到:
评论

相关推荐

    UML与设计模式的浅析

    【UML与设计模式浅析】 UML(Unified Modeling Language),即统一建模语言,是一种用于软件系统分析和设计的标准图形表示法。它为软件开发提供了可视化工具,以描绘系统的需求、架构、交互以及实现等多个方面。UML...

    可外接充电式混合动力电动汽车特点和设计浅析.pdf

    1. **续驶里程设定**:PHEV的纯电动续驶里程是用户关注的重要指标,它取决于电池容量和SOC(State of Charge,电池荷电状态)范围。设定合理的纯电动续驶里程需要考虑用户日常行驶距离,通常依据利用率(Usage Factor...

    oSIP 协议栈浅析

    oSIP的状态机模块是其核心组件之一,用于处理事务的生命周期,并根据不同的消息类型和响应执行相应的动作。 ###### 2.2.1 概述 oSIP的状态机分为四种类型: - **ICT (Invite Client Transaction)**:处理发起邀请...

    11-vue-router-模式.md

    React Router的路由模式设计上与Vue-router类似,它同样提供了三种模式: - **browserhistory**:类似于Vue-router的history模式。 - **hashhistory**:类似于Vue-router的hash模式。 - **memoryhistory**:类似于...

    浅析开源项目之Ceph1

    此外,PG一致性协议(如StateMachine、Failover Overview、PG Peering和Recovery/Backfill)保证了数据在不同OSD间的正确同步和故障恢复。 【存储引擎】 Ceph有两种主要的存储引擎——FileStore和BlueStore。...

    浅析Node在构建超媒体API中的作用

    REST(Representational State Transfer)是一种Web服务设计模式,它强调使用HTTP协议的固有方法(如GET、POST、PUT、DELETE)来操作资源。Node.js可以直接处理这些请求,通过URI标识资源,并使用不同的HTTP方法执行...

    工作资源汇总

    REST API的核心理念之一是无状态性,即服务器在处理请求时不应该存储任何有关客户端的状态信息。这种设计有助于提高系统的可伸缩性和可用性,简化了服务器端的实现复杂度。REST API还遵循统一接口的原则,主要包括...

Global site tag (gtag.js) - Google Analytics