Python設計模式中的備忘錄模式
備忘錄模式
備忘錄模式,在不破壞封閉的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先保存的狀態(tài)。
簡單來說,就是在運行過程中我們可以記錄某個狀態(tài),當遇到錯誤時恢復當前狀態(tài),這在業(yè)務流程中是用設計來處理異常情況。
優(yōu)點:
- 有時一些發(fā)起人對象的內部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取。這時,使用備忘錄模式可以把復雜的發(fā)起人內部信息對其他的對象屏蔽起來,從而可以恰當?shù)乇3址庋b的邊界。
- 本模式簡化了發(fā)起人。發(fā)起人不再需要管理和保存其內部狀態(tài)的一個個版本,客戶端可以自行管理他們所需要的這些狀態(tài)的版本。
- 當發(fā)起人角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復原。
缺點:
- 如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中,那么在資源消耗上面?zhèn)渫泴ο髸馨嘿F。
- 當負責人角色將一個備忘錄存儲起來的時候,負責人可能并不知道這個狀態(tài)會占用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴。
- 當發(fā)起人角色的狀態(tài)改變的時候,有可能這個協(xié)議無效。如果狀態(tài)改變的成功率不高的話,不如采取“假如”協(xié)議模式。
應用場景

實體角色:
Originator(發(fā)起人):負責創(chuàng)建一個 Memento(備忘錄),用以記錄當前時刻自身的內部狀態(tài),并可使用備忘錄恢復內部狀態(tài)。Originator 可以根據(jù)需要決定 Memento 存儲自己的哪些內部狀態(tài)。
Memento(備忘錄):負責存儲 Originator 對象的內部狀態(tài),并可以防止 Originator 以外的其他對象訪問備忘錄。備忘錄有兩個接口:
1.Caretaker 只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。
2.Originator 卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)。
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("備份數(shù)據(jù):{}".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)
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Python中使用Selenium環(huán)境安裝的方法步驟
這篇文章主要介紹了Python中使用Selenium環(huán)境安裝的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
python使用Tkinter實現(xiàn)在線音樂播放器
這篇文章主要為大家詳細介紹了python使用Tkinter實現(xiàn)在線音樂播放器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Python?pyasn庫解析和生成ASN.1數(shù)據(jù)結構
這篇文章主要介紹了Python?pyasn庫實現(xiàn)ASN.1數(shù)據(jù)結構的解析和生成實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Python編程實現(xiàn)下載器自動爬取采集B站彈幕示例
這篇文章主要介紹了使用Python編程來實現(xiàn)一個下載器可以自動爬取采集B站彈幕的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-10-10
python elasticsearch從創(chuàng)建索引到寫入數(shù)據(jù)的全過程
這篇文章主要介紹了python elasticsearch從創(chuàng)建索引到寫入數(shù)據(jù)的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
twilio python自動撥打電話,播放自定義mp3音頻的方法
今天小編就為大家分享一篇twilio python自動撥打電話,播放自定義mp3音頻的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

