設計模式之備忘模式

2022-05-12 03:59:35 字數 3166 閱讀 1459

from copy import

deepcopy

import

logging, time

#備忘模式中主要有三個角色:發起人(需要進行備份的物件)、備忘錄(備份的狀態,即乙個備份的文件)、備忘錄管理者(備份文件的管理者,由他負責人與發起人的互動)

#應用場景:1、需要儲存/恢復物件的狀態或資料時,如遊戲的存檔、虛擬機器的快照

#2、需要撤銷、恢復功能的場景

#3、提供乙個可回滾的操作,如資料庫的事務管理

class

memento:

"""備忘錄

"""def

__init__

(self):

self.cmdname = ""

self.cmdargs =

defsetattributes(self, _dict):

"""深度拷貝字典dict中的所有屬性

"""self.

__dict__ =deepcopy(_dict)

defgetattributes(self):

"""獲取屬性字典

"""return self.__dict__

def__repr__

(self):

return self.cmdname + "

" + "

".join(self.cmdargs)

class

caretaker:

"""備忘錄管理類

"""def

__init__

(self):

self._mementos ={}

defaddmemento(self, memento):

name = time.strftime("

%y-%m-%d %h:%m:%s

", time.localtime())

self._mementos[name] =memento

defgetmemento(self, name):

return

self._mementos[name]

class

originator:

"""備份發起人

"""def

creatememento(self):

memento =memento()

memento.setattributes(self.

__dict__

)

return

memento

defrestorefrommemento(self, memento):

self.

__dict__

.update(memento.getattributes())

#doc歷史指令儲存

class

terminalcmd(originator):

"""終端命令

"""def

__init__

(self, text):

self.cmdname = ""

self.cmdargs =

self.parsecmd(text)

defparsecmd(self, text):

"""從字串中解析命令

"""substrs = self.getargumentsfromstring(text, "")

#獲取第乙個字段作為命令的名稱

if len(substrs) >0:

self.cmdname =substrs[0]

if len(substrs) >0:

self.cmdargs = substrs[1:]

defgetargumentsfromstring(self, _str, splitflag):

"""通過splitflag進行分割,獲得引數陣列

"""if splitflag == ""

: logging.warning(

"splitflag為空!")

return

""data =_str.split(splitflag)

result =

for item in

data:

item.strip()

if item != ""

:

return

result

defshowcmd(self):

print

(self.cmdname, self.cmdargs)

class

terminalcaretaker(caretaker):

"""終端命令的備忘錄管理器

"""def

showhistory(self):

"""顯示歷史命令

"""for key, memento in

self._mementos.items():

print(key + ":"

, memento)

deftestterminal():

caretaker =terminalcaretaker()

curcmd = terminalcmd(""

)

while

true:

strcmd = input("

請輸入指令:")

strcmd =strcmd.lower()

if strcmd.startswith("q"

): exit(0)

elif strcmd.startswith("h"

): caretaker.showhistory()

elif strcmd.startswith("!"

): idx = strcmd[1]

curcmd.restorefrommemento(caretaker.getmemento(idx))

curcmd.showcmd()

else

: curcmd =terminalcmd(strcmd)

curcmd.showcmd()

caretaker.addmemento(curcmd.creatememento())

testterminal()

設計模式之備忘錄模式

機器 public class machine public void startplay disc.setluminance 60 disc.settime 0 disc.setvolume 80 public void stopplay disc.setluminance 70 disc.set...

設計模式之備忘錄模式

定義 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。備忘錄模式有三個角色 以儲存遊戲進度為例,退出遊戲前存檔,再進入遊戲就會顯示退出之前的狀態。示例 遊戲發起人類 public class game public state cr...

設計模式之 備忘錄模式

定義 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣就可以將該物件 恢復到原先儲存的狀態。很好理解,就像我們以前打通關遊戲一樣,打通某個關卡,就會備份一下,不然根本通不了關。備忘錄 負責儲存發起人物件的內部狀態,在需要的時候提供發起人需要的內部狀態。public c...