这个是照着一篇文章实现的ruby版。文章链接
http://blog.csdn.net/shuangde800/article/details/10132825?reload
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