1. 備忘錄模式(Memento)介紹
UML類圖
角色介紹
- 發起人:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責創建和恢復備忘錄數據。
- 備忘錄:負責存儲發起人對象的內部狀態,在需要的時候提供發起人需要的內部狀態。
- 管理角色:對備忘錄進行管理,保存和提供備忘錄。
用途
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣就可以將該對象恢復到原先保存的狀態
2. 示例
- 我們在編程的時候,經常需要保存對象的中間狀態,當需要的時候,可以恢復到這個狀態。比如,我們使用Eclipse進行編程時,假如編寫失誤(例如不小心誤刪除了幾行代碼),我們希望返回刪除前的狀態,便可以使用Ctrl+Z來進行返回。這時我們便可以使用備忘錄模式來實現。
- 代碼演示了一個單狀態單備份的例子,邏輯非常簡單:Originator類中的state變量需要備份,以便在需要的時候恢復;Memento類中,也有一個state變量,用來存儲Originator類中state變量的臨時狀態;而Caretaker類就是用來管理備忘錄類的,用來向備忘錄對象中寫入狀態或者取回狀態。
"""Memento Pattern with Python Code
"""
class Memento(object):
def __init__(self, state):
self.state = state
def getState(self):
return self.state
def setState(self, state):
self.state = state
class Originator(object):
def getState(self):
return self.state
def setState(self, state):
self.state = state
def createMemento(self):
return Memento(self.state)
def restoreMemento(self, memento:Memento):
self.setState(memento.getState())
class Caretaker(object):
def getMemento(self):
return self.memento
def setMemento(self, memento:Memento):
self.memento = memento
class Client(object):
def main(self):
originator = Originator()
originator.setState("狀態1");
print("初始狀態:" + originator.getState())
caretaker = Caretaker()
caretaker.setMemento(originator.createMemento())
originator.setState("狀態2")
print("改變後狀態:" + originator.getState())
originator.restoreMemento(caretaker.getMemento())
print("恢復後狀態:" + originator.getState())
if __name__ == "__main__":
Client().main()
輸出:
# ./Memento.py
初始狀態:狀態1
改變後狀態:狀態2
恢復後狀態:狀態1
參考:
https://wiki.jikexueyuan.com/project/java-design-pattern/memento-pattern.html