21-Python與設計模式--備忘錄模式
阿新 • • 發佈:2019-01-06
一、遊戲進度儲存
打過遊戲的朋友一定知道,大多數遊戲都有儲存進度的功能,如果一局遊戲下來,忘儲存了進度,那麼下次只能從上次進度點開始重新打了。一般情況下,儲存進度是要存在可持久化儲存器上,本例中先以儲存在記憶體中來模擬實現該場景的情形。
以模擬一個戰鬥角色為例。首先,建立遊戲角色。
class GameCharacter(): vitality = 0 attack = 0 defense = 0 def displayState(self): print 'Current Values:' print 'Life:%d' % self.vitality print 'Attack:%d' % self.attack print 'Defence:%d' % self.defense def initState(self,vitality,attack,defense): self.vitality = vitality self.attack = attack self.defense = defense def saveState(self): return Memento(self.vitality, self.attack, self.defense) def recoverState(self, memento): self.vitality = memento.vitality self.attack = memento.attack self.defense = memento.defense class FightCharactor(GameCharacter): def fight(self): self.vitality -= random.randint(1,10)
GameCharacter定義了基本的生命值、攻擊值、防禦值以及實現角色狀態控制的方法,FightCharactor實現具體的“戰鬥”介面。為實現儲存進度的細節,還需要一個備忘錄,來儲存進度。
class Memento: vitality = 0 attack = 0 defense = 0 def __init__(self, vitality, attack, defense): self.vitality = vitality self.attack = attack self.defense = defense
萬事俱備,在業務邏輯中可以進行類的排程了。
if __name__=="__main__": game_chrctr = FightCharactor() game_chrctr.initState(100,79,60) game_chrctr.displayState() memento = game_chrctr.saveState() game_chrctr.fight() game_chrctr.displayState() game_chrctr.recoverState(memento) game_chrctr.displayState()
列印如下:
Current Values:
Life:100
Attack:79
Defence:60
Current Values:
Life:91
Attack:79
Defence:60
Current Values:
Life:100
Attack:79
Defence:60
由生命值變化可知,先儲存狀態值,經過一輪打鬥後,生命值由100變為91,而後恢復狀態值,生命值又恢復成100。
二、備忘錄模式
備忘錄模式定義如下:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原來儲存的狀態。在備忘錄模式中,如果要儲存的狀態多,可以創造一個備忘錄管理者角色來管理備忘錄。
三、備忘錄模式應用場景
1、需要儲存和恢復資料的相關狀態場景。如儲存遊戲狀態的場景;撤銷場景,如Ctrl-Z操作;事務回滾的應用。一般情況下事務回滾有兩種方式:一是把從恢復點開始的操作都反向執行一遍;二是直接恢復到恢復點的各種狀態。兩種方式各有優缺點,要結合業務場景,決定使用哪種模式;
2、副本監控場景。備忘錄可以當作一個臨時的副本監控,實現非實時和準實時的監控。