Python與設(shè)計(jì)模式之備忘錄模式

一、游戲進(jìn)度保存

打過(guò)游戲的朋友一定知道,大多數(shù)游戲都有保存進(jìn)度的功能,如果一局游戲下來(lái),忘保存了進(jìn)度,那么下次只能從上次進(jìn)度點(diǎn)開(kāi)始重新打了。一般情況下,保存進(jìn)度是要存在可持久化存儲(chǔ)器上,本例中先以保存在內(nèi)存中來(lái)模擬實(shí)現(xiàn)該場(chǎng)景的情形。
以模擬一個(gè)戰(zhàn)斗角色為例。首先,創(chuàng)建游戲角色。

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定義了基本的生命值、攻擊值、防御值以及實(shí)現(xiàn)角色狀態(tài)控制的方法,F(xiàn)ightCharactor實(shí)現(xiàn)具體的“戰(zhàn)斗”接口。為實(shí)現(xiàn)保存進(jìn)度的細(xì)節(jié),還需要一個(gè)備忘錄,來(lái)保存進(jìn)度。

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)

萬(wàn)事俱備,在業(yè)務(wù)邏輯中可以進(jìn)行類(lèi)的調(diào)度了。

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

由生命值變化可知,先保存狀態(tài)值,經(jīng)過(guò)一輪打斗后,生命值由100變?yōu)?1,而后恢復(fù)狀態(tài)值,生命值又恢復(fù)成100。

二、備忘錄模式

備忘錄模式定義如下:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可以將該對(duì)象恢復(fù)到原來(lái)保存的狀態(tài)。在備忘錄模式中,如果要保存的狀態(tài)多,可以創(chuàng)造一個(gè)備忘錄管理者角色來(lái)管理備忘錄。

備忘錄模式

三、備忘錄模式應(yīng)用場(chǎng)景

1、需要保存和恢復(fù)數(shù)據(jù)的相關(guān)狀態(tài)場(chǎng)景。如保存游戲狀態(tài)的場(chǎng)景;撤銷(xiāo)場(chǎng)景,如Ctrl-Z操作;事務(wù)回滾的應(yīng)用。一般情況下事務(wù)回滾有兩種方式:一是把從恢復(fù)點(diǎn)開(kāi)始的操作都反向執(zhí)行一遍;二是直接恢復(fù)到恢復(fù)點(diǎn)的各種狀態(tài)。兩種方式各有優(yōu)缺點(diǎn),要結(jié)合業(yè)務(wù)場(chǎng)景,決定使用哪種模式;
2、副本監(jiān)控場(chǎng)景。備忘錄可以當(dāng)作一個(gè)臨時(shí)的副本監(jiān)控,實(shí)現(xiàn)非實(shí)時(shí)和準(zhǔn)實(shí)時(shí)的監(jiān)控。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 開(kāi)發(fā)仿真系統(tǒng)## 考慮這樣一個(gè)仿真應(yīng)用,功能是:模擬運(yùn)行針對(duì)某個(gè)具體問(wèn)題的多個(gè)解決方案,記...
    七寸知架構(gòu)閱讀 2,249評(píng)論 1 50
  • 定義 備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是對(duì)象的行為模式。 備忘錄對(duì)象...
    步積閱讀 3,133評(píng)論 0 2
  • 又是一個(gè)陽(yáng)春三月,天上飄著最美的云彩,枯樹(shù)上發(fā)著嫩綠的枝丫,花朵競(jìng)相綻放著。這本是萬(wàn)物復(fù)蘇的季節(jié),這本是一切開(kāi)始的...
    七禾有木閱讀 555評(píng)論 0 0
  • 自我覺(jué)知真的是一件很重要的事,一個(gè)問(wèn)題只有你自己深刻意識(shí)到了,才會(huì)去改變不是么? 我是不自信很自卑的人,這一點(diǎn)我承...
    搖月亮閱讀 238評(píng)論 1 0
  • 身體內(nèi)除了水之外,最大的組成成分就是蛋白質(zhì),約占身體的17%,頭發(fā)、指甲、皮膚及肌肉組織幾乎完全由蛋白質(zhì)構(gòu)成?;畹?..
    c2d0f89799f8閱讀 381評(píng)論 0 0

友情鏈接更多精彩內(nèi)容