这个是照着一篇文章实现的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(Unified Modeling Language),即统一建模语言,是一种用于软件系统分析和设计的标准图形表示法。它为软件开发提供了可视化工具,以描绘系统的需求、架构、交互以及实现等多个方面。UML...
1. **续驶里程设定**:PHEV的纯电动续驶里程是用户关注的重要指标,它取决于电池容量和SOC(State of Charge,电池荷电状态)范围。设定合理的纯电动续驶里程需要考虑用户日常行驶距离,通常依据利用率(Usage Factor...
oSIP的状态机模块是其核心组件之一,用于处理事务的生命周期,并根据不同的消息类型和响应执行相应的动作。 ###### 2.2.1 概述 oSIP的状态机分为四种类型: - **ICT (Invite Client Transaction)**:处理发起邀请...
React Router的路由模式设计上与Vue-router类似,它同样提供了三种模式: - **browserhistory**:类似于Vue-router的history模式。 - **hashhistory**:类似于Vue-router的hash模式。 - **memoryhistory**:类似于...
此外,PG一致性协议(如StateMachine、Failover Overview、PG Peering和Recovery/Backfill)保证了数据在不同OSD间的正确同步和故障恢复。 【存储引擎】 Ceph有两种主要的存储引擎——FileStore和BlueStore。...
REST(Representational State Transfer)是一种Web服务设计模式,它强调使用HTTP协议的固有方法(如GET、POST、PUT、DELETE)来操作资源。Node.js可以直接处理这些请求,通过URI标识资源,并使用不同的HTTP方法执行...
REST API的核心理念之一是无状态性,即服务器在处理请求时不应该存储任何有关客户端的状态信息。这种设计有助于提高系统的可伸缩性和可用性,简化了服务器端的实现复杂度。REST API还遵循统一接口的原则,主要包括...