from copy importdeepcopy
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):
(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...