设计模式之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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值