Python設計模式中的備忘錄模式

備忘錄模式

備忘錄模式,在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。

簡單來說,就是在運行過程中我們可以記錄某個狀態,當遇到錯誤時恢復當前狀態,這在業務流程中是用設計來處理異常情況。

優點

  • 有時一些發起人對象的內部信息必須保存在發起人對象以外的地方,但是必須要由發起人對象自己讀取。這時,使用備忘錄模式可以把復雜的發起人內部信息對其他的對象屏蔽起來,從而可以恰當地保持封裝的邊界。
  • 本模式簡化瞭發起人。發起人不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理他們所需要的這些狀態的版本。
  • 當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。

缺點

  • 如果發起人角色的狀態需要完整地存儲到備忘錄對象中,那麼在資源消耗上面備忘錄對象會很昂貴。
  • 當負責人角色將一個備忘錄存儲起來的時候,負責人可能並不知道這個狀態會占用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴。
  • 當發起人角色的狀態改變的時候,有可能這個協議無效。如果狀態改變的成功率不高的話,不如采取“假如”協議模式。

應用場景

 

在這裡插入圖片描述

實體角色:

Originator(發起人):負責創建一個 Memento(備忘錄),用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。Originator 可以根據需要決定 Memento 存儲自己的哪些內部狀態。

Memento(備忘錄):負責存儲 Originator 對象的內部狀態,並可以防止 Originator 以外的其他對象訪問備忘錄。備忘錄有兩個接口:

1.Caretaker 隻能看到備忘錄的窄接口,他隻能將備忘錄傳遞給其他對象。

2.Originator 卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態所需要的所有數據。

Caretaker(管理者):負責 Memento,不能對 Memento 的內容進行訪問或者操作。

代碼示例

class AddNumber:
    def __init__(self):
        self.start = 1
    def add(self, number):
        self.start += number
        print(self.start)

class Memento:
    """備忘錄"""
    def backups(self, obj=None):
        """
        設置備份方法
        :param obj: 
        :return: 
        """
        self.obj_dict = copy.deepcopy(obj.__dict__)
        print("備份數據:{}".format(self.obj_dict))
    def recovery(self, obj):
        """
        恢復備份方法
        :param obj: 
        :return: 
        """
        obj.__dict__.clear()
        obj.__dict__.update(self.obj_dict)
        return obj

if __name__ == '__main__':
    test = AddNumber()
    memento = Memento()
    for i in [1, 2, 3, 'n', 4]:
        if i == 2:
            memento.backups(test)
        try:
            test.add(i)
        except TypeError as e:
            print(e)
            print(test.start)
    memento.recovery(test)
    print(test.start)

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容! 

推薦閱讀: