python設計模式18-備忘錄模式

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

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