python設計模式(十九):備忘錄模式

備忘錄已维,定義是:在不破壞封閉的前提下淆攻,捕獲一個對象的內部狀態(tài)阔墩,并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先保存的狀態(tài)瓶珊。簡單來說在運行過程中我們可以記錄某個狀態(tài)啸箫,當遇到錯誤時恢復當前狀態(tài),這在業(yè)務流程中是用設計來處理異常情況伞芹。

示例code:

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)

--------------------
2
備份數據:{'start': 2}
4
7
unsupported operand type(s) for +=: 'int' and 'str'
7
11
2

上面案例是不嚴謹的忘苛,意在闡述備忘錄的思想,實際中完整的備忘錄應該有三個重要角色:

1.Originator(發(fā)起人):負責創(chuàng)建一個備忘錄Memento唱较,用以記錄當前時刻自身的內部狀態(tài)扎唾,并可使用備忘錄恢復內部狀態(tài)。Originator可以根據需要決定Memento存儲自己的哪些內部狀態(tài)南缓。

2.Memento(備忘錄):負責存儲Originator對象的內部狀態(tài)胸遇,并可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口汉形,他只能將備忘錄傳遞給其他對象纸镊。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數據概疆。

3.Caretaker(管理者):負責備忘錄Memento逗威,不能對Memento的內容進行訪問或者操作。

image

備忘錄模式的優(yōu)點和缺點

一岔冀、備忘錄模式的優(yōu)點

1庵楷、有時一些發(fā)起人對象的內部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取楣颠,這時尽纽,

使用備忘錄模式可以把復雜的發(fā)起人內部信息對其他的對象屏蔽起來,從而可以恰當地保持封裝的邊界童漩。

2弄贿、本模式簡化了發(fā)起人類。發(fā)起人不再需要管理和保存其內部狀態(tài)的一個個版本矫膨,客戶端可以自行管理他們所需

要的這些狀態(tài)的版本差凹。

3期奔、當發(fā)起人角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效危尿,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復原呐萌。

二、備忘錄模式的缺點:

1谊娇、如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中肺孤,那么在資源消耗上面?zhèn)渫泴ο髸馨嘿F。

2济欢、當負責人角色將一個備忘錄 存儲起來的時候赠堵,負責人可能并不知道這個狀態(tài)會占用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴法褥。

3茫叭、當發(fā)起人角色的狀態(tài)改變的時候,有可能這個協(xié)議無效半等。如果狀態(tài)改變的成功率不高的話揍愁,不如采取“假如”協(xié)議模式。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末杀饵,一起剝皮案震驚了整個濱河市吗垮,隨后出現(xiàn)的幾起案子凹髓,更是在濱河造成了極大的恐慌烁登,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚舀,死亡現(xiàn)場離奇詭異饵沧,居然都是意外死亡,警方通過查閱死者的電腦和手機赌躺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門狼牺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礼患,你說我怎么就攤上這事是钥。” “怎么了缅叠?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵悄泥,是天一觀的道長。 經常有香客問我肤粱,道長弹囚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任领曼,我火速辦了婚禮鸥鹉,結果婚禮上蛮穿,老公的妹妹穿的比我還像新娘。我一直安慰自己毁渗,他們只是感情好践磅,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灸异,像睡著了一般府适。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绎狭,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天细溅,我揣著相機與錄音褥傍,去河邊找鬼儡嘶。 笑死,一個胖子當著我的面吹牛恍风,可吹牛的內容都是我干的蹦狂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼朋贬,長吁一口氣:“原來是場噩夢啊……” “哼凯楔!你這毒婦竟也來了?” 一聲冷哼從身側響起锦募,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摆屯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糠亩,有當地人在樹林里發(fā)現(xiàn)了一具尸體虐骑,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年赎线,在試婚紗的時候發(fā)現(xiàn)自己被綠了廷没。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡垂寥,死狀恐怖颠黎,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情滞项,我是刑警寧澤狭归,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站文判,受9級特大地震影響唉铜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜律杠,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一潭流、第九天 我趴在偏房一處隱蔽的房頂上張望竞惋。 院中可真熱鬧,春花似錦灰嫉、人聲如沸拆宛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浑厚。三九已至,卻和暖如春根盒,著一層夾襖步出監(jiān)牢的瞬間钳幅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工炎滞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敢艰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓册赛,卻偏偏與公主長得像钠导,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子森瘪,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容