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。

二、備忘錄模式

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

 

三、備忘錄模式應用場景

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章