1. 程式人生 > >21-Python與設計模式--備忘錄模式

21-Python與設計模式--備忘錄模式

一、遊戲進度儲存

打過遊戲的朋友一定知道,大多數遊戲都有儲存進度的功能,如果一局遊戲下來,忘儲存了進度,那麼下次只能從上次進度點開始重新打了。一般情況下,儲存進度是要存在可持久化儲存器上,本例中先以儲存在記憶體中來模擬實現該場景的情形。
以模擬一個戰鬥角色為例。首先,建立遊戲角色。

複製程式碼
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。

二、備忘錄模式

備忘錄模式定義如下:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原來儲存的狀態。在備忘錄模式中,如果要儲存的狀態多,可以創造一個備忘錄管理者角色來管理備忘錄。


f1.png

 

三、備忘錄模式應用場景

1、需要儲存和恢復資料的相關狀態場景。如儲存遊戲狀態的場景;撤銷場景,如Ctrl-Z操作;事務回滾的應用。一般情況下事務回滾有兩種方式:一是把從恢復點開始的操作都反向執行一遍;二是直接恢復到恢復點的各種狀態。兩種方式各有優缺點,要結合業務場景,決定使用哪種模式;
2、副本監控場景。備忘錄可以當作一個臨時的副本監控,實現非實時和準實時的監控。