2018-02-11-python状态机设计模式 发表于 2018-02-11 | 分类于 技术 python demo 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163# -*- coding: utf-8 -*-'''状态机设计模式-demo'''import randomclass Machine(object): '''糖果机类''' def __init__(self, num): self.num = num self.set_state('no_coin') def set_state(self, state): if self.num <= 0: self.state = 'sold_out' else: self.state = state def get_state(self): if self.state == 'coin_in': return CoinInState(self) if self.state == 'no_coin': return NoCoinState(self) if self.state == 'sold': return SoldState(self) if self.state == 'winner': return WinnerState(self) return SoldOutState(self) def sub(self): if self.num > 0: self.num -= 1 def coin_in(self): self.get_state().coin_in() def coin_out(self): self.get_state().coin_out() def turn(self): self.get_state().turn() def out(self): self.get_state().out()class State(object): '''状态基类''' def coin_in(self): raise NotImplementedError def coin_out(self): raise NotImplementedError def turn(self): raise NotImplementedErrorclass NoCoinState(State): def __init__(self, machine): self.machine = machine def coin_in(self): print('你投入了5元') self.machine.set_state('coin_in') def coin_out(self): print('您还没有投币,不能退币,想多了吧?') def turn(self): print('您还没有投币,不能转动手柄,想多了吧?')class CoinInState(State): def __init__(self, machine): self.machine = machine def coin_in(self): print('您已经投入了5元,无需再次投入') def coin_out(self): print('ok,马上退回您的5元') self.machine.set_state('no_coin') def turn(self): print('ok, 稍等片刻,马上给您饮料') winner = random.randint(1, 10) if winner == 1: self.machine.set_state('winner') else: self.machine.set_state('sold')class SoldState(State): def __init__(self, machine): self.machine = machine def coin_in(self): print('您已经投了5元,不要再投了') def coin_out(self): print('已经转动了手柄,不能再退回钱了') def turn(self): print('别着急,您已经转动了手柄,请稍等片刻取走您的商品') def out(self): '''售卖机内部动作,无需手动调用,由售卖机自动调用''' self.machine.sub() self.machine.set_state('no_coin')class SoldOutState(State): def __init__(self, machine): self.machine = machine def coin_in(self): print("所有商品已售完") def coin_out(self): print("所有商品已售完") def turn(self): print("所有商品已售完") def out(self): print("所有商品已售完")class WinnerState(State): def __init__(self, machine): self.machine = machine def coin_in(self): print('您已经投了5元,不要再投了') def coin_out(self): print('已经转动了手柄,不能再退回钱了') def turn(self): print('别着急,您已经转动了手柄,请稍等片刻取走您的商品') def out(self): print('中奖了,多赠送一个') self.machine.sub() if self.machine.num > 0: self.machine.sub() else: print('悲哀,库存不存,只能白中奖了') self.machine.set_state('no_coin')if __name__ == '__main__': machine = Machine(10) for i in range(10): machine.coin_in() machine.turn() machine.out()