Python設(shè)計(jì)模式中的備忘錄模式
備忘錄模式
備忘錄模式,在不破壞封閉的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
簡(jiǎn)單來說,就是在運(yùn)行過程中我們可以記錄某個(gè)狀態(tài),當(dāng)遇到錯(cuò)誤時(shí)恢復(fù)當(dāng)前狀態(tài),這在業(yè)務(wù)流程中是用設(shè)計(jì)來處理異常情況。
優(yōu)點(diǎn):
- 有時(shí)一些發(fā)起人對(duì)象的內(nèi)部信息必須保存在發(fā)起人對(duì)象以外的地方,但是必須要由發(fā)起人對(duì)象自己讀取。這時(shí),使用備忘錄模式可以把復(fù)雜的發(fā)起人內(nèi)部信息對(duì)其他的對(duì)象屏蔽起來,從而可以恰當(dāng)?shù)乇3址庋b的邊界。
- 本模式簡(jiǎn)化了發(fā)起人。發(fā)起人不再需要管理和保存其內(nèi)部狀態(tài)的一個(gè)個(gè)版本,客戶端可以自行管理他們所需要的這些狀態(tài)的版本。
- 當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)狀態(tài)無效,這時(shí)候就可以使用暫時(shí)存儲(chǔ)起來的備忘錄將狀態(tài)復(fù)原。
缺點(diǎn):
- 如果發(fā)起人角色的狀態(tài)需要完整地存儲(chǔ)到備忘錄對(duì)象中,那么在資源消耗上面?zhèn)渫泴?duì)象會(huì)很昂貴。
- 當(dāng)負(fù)責(zé)人角色將一個(gè)備忘錄存儲(chǔ)起來的時(shí)候,負(fù)責(zé)人可能并不知道這個(gè)狀態(tài)會(huì)占用多大的存儲(chǔ)空間,從而無法提醒用戶一個(gè)操作是否很昂貴。
- 當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)協(xié)議無效。如果狀態(tài)改變的成功率不高的話,不如采取“假如”協(xié)議模式。
應(yīng)用場(chǎng)景
實(shí)體角色:
Originator
(發(fā)起人):負(fù)責(zé)創(chuàng)建一個(gè) Memento(備忘錄),用以記錄當(dāng)前時(shí)刻自身的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Originator 可以根據(jù)需要決定 Memento 存儲(chǔ)自己的哪些內(nèi)部狀態(tài)。
Memento
(備忘錄):負(fù)責(zé)存儲(chǔ) Originator 對(duì)象的內(nèi)部狀態(tài),并可以防止 Originator 以外的其他對(duì)象訪問備忘錄。備忘錄有兩個(gè)接口:
1.Caretaker
只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對(duì)象。
2.Originator
卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)。
Caretaker
(管理者):負(fù)責(zé) Memento,不能對(duì) Memento 的內(nèi)容進(jìn)行訪問或者操作。
代碼示例
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): """ 設(shè)置備份方法 :param obj: :return: """ self.obj_dict = copy.deepcopy(obj.__dict__) print("備份數(shù)據(jù):{}".format(self.obj_dict)) def recovery(self, obj): """ 恢復(fù)備份方法 :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)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python中使用Selenium環(huán)境安裝的方法步驟
這篇文章主要介紹了Python中使用Selenium環(huán)境安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02python使用Tkinter實(shí)現(xiàn)在線音樂播放器
這篇文章主要為大家詳細(xì)介紹了python使用Tkinter實(shí)現(xiàn)在線音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例
這篇文章主要介紹了Python求兩個(gè)字符串最長(zhǎng)公共子序列代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Python實(shí)現(xiàn)arctan換算角度的示例
本文主要介紹了Python實(shí)現(xiàn)arctan換算角度的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python?pyasn庫(kù)解析和生成ASN.1數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Python?pyasn庫(kù)實(shí)現(xiàn)ASN.1數(shù)據(jù)結(jié)構(gòu)的解析和生成實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python編程實(shí)現(xiàn)下載器自動(dòng)爬取采集B站彈幕示例
這篇文章主要介紹了使用Python編程來實(shí)現(xiàn)一個(gè)下載器可以自動(dòng)爬取采集B站彈幕的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10python elasticsearch從創(chuàng)建索引到寫入數(shù)據(jù)的全過程
這篇文章主要介紹了python elasticsearch從創(chuàng)建索引到寫入數(shù)據(jù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08twilio python自動(dòng)撥打電話,播放自定義mp3音頻的方法
今天小編就為大家分享一篇twilio python自動(dòng)撥打電話,播放自定義mp3音頻的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08