# Memento パターン # # Java言語で学ぶデザインパターンと同様の例題をRubyで記述した。 # # coded by Takehiro Kaga # class Memento def initialize(money) @money = money @fruits = Array.new end attr_accessor :money # @moneyは書き換え可能 def getMoney @money end def addFruit(fruit) @fruits.push(fruit) end def getFruits @fruits.clone end end class Gamer def initialize( money ) @money = money @fruits = Array.new @fruitsname = ["りんご ", "ぶどう ", "バナナ ", "みかん "] end def getMoney @money end def bet dice = rand(6) + 1 if dice == 1 @money += 100 puts "所持金が増えました。" elsif dice == 2 @money = @money / 2 puts "所持金が半分になりました。" elsif dice == 6 f = getFruit puts("フルーツ(" + f + ")をもらいました。") @fruits.push(f) else puts "何もおこりませんでした。" end end def createMemento m = Memento.new(@money) @fruits.each {|fruit| if /^おいしい/ =~ fruit # おいしい で始まっていれば一致する m.addFruit(fruit) end } m end def restoreMemento(memento) # undoを行う @money = memento.money @fruits = memento.getFruits end def toString "[money = " + @money.to_s + ", fruits = " + @fruits.to_s + "]" end def getFruit prefix = " " if rand(2) == 1 # ランダムに確率で判断 prefix = "おいしい" end prefix + @fruitsname[ rand(@fruitsname.length) ] end end # ---- Main ---- # gamer = Gamer.new(100) memento = gamer.createMemento # 最初の状態を保存 for i in 0..100 puts "=== " + i.to_s puts "現状:" + gamer.toString gamer.bet puts "所持金は" + gamer.getMoney.to_s + "円になりました。" # Mementoの取り扱いの決定 if gamer.getMoney > memento.getMoney puts " (だいぶ増えたので、現在の状態を保存しておこう) " memento = gamer.createMemento elsif gamer.getMoney < memento.getMoney / 2 puts " (だいぶ減ったので、以前の状態に復帰しよう) " gamer.restoreMemento(memento) else end sleep(2) puts " " end