設計之禪 備忘錄模式

2021-09-20 21:40:40 字數 1235 閱讀 5041

備忘錄模式是非常簡單的一種模式,應用場景非常廣泛,如編輯器的ctrl + z、資料庫事務的回滾、遊戲的存檔等等都符合該模式的思想——備份(比較疑惑為什麼叫備忘錄模式,叫備份模式不是更貼切麼?)。

備忘錄模式就是將乙個物件的內部狀態儲存到物件的外部,這樣,在將來的任一時間點都可以恢復到之前的狀態,讓我們有後悔藥可以吃。它包含了發起人(originator)、備忘錄(memento)、負責人(caretaker)三個角色:

模式的結構和定義都非常簡單,下面就實現乙個文字編輯器的「撤銷」功能。

public

class

editor

public

void

setcontent

(string content)

public memento creatememento()

public

void

undo

(memento memento)

}

備忘錄物件:

public

class

memento

public string getcontent()

}

負責人,只提供儲存和傳遞備忘錄物件的方法,不能對備忘錄內部狀態進行修改(這是必須的,否則無法保證恢復的資料是最初的資料,備忘錄模式還有什麼意義?):

public

class

caretaker

public memento getmemento()

}

public

static

void

main

(string[

] args)

輸出如下:

第一次修改內容:1

第二次修改後內容:2

第三次次修改後內容:3

第四次次修改後內容:4

第一次恢復後的內容:3

第二次恢復後的內容:2

第三次恢復後的內容:1

這樣我們就實現了乙個單狀態的備忘錄模式,但在實際應用中,業務場景會複雜很多,我們可能會需要儲存很多的狀態,應該如何做呢?讀者們可以自行思考一下,這裡我就不展開了

備忘錄模式給我們提供了「後悔藥」,讓我們在需要時可以隨時反悔,但是當記錄的狀態非常多時,就會占用大量的資源,因此在使用時需要設定合理的上限。

《設計模式之禪》之備忘錄模式

備忘錄模式提供了一種彌補真實世界缺陷的方法,讓 後悔藥 在程式的世界中真實可行,其定義如下 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator發起人角色 記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負...

設計模式之備忘錄模式

機器 public class machine public void startplay disc.setluminance 60 disc.settime 0 disc.setvolume 80 public void stopplay disc.setluminance 70 disc.set...

設計模式之備忘錄模式

定義 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。備忘錄模式有三個角色 以儲存遊戲進度為例,退出遊戲前存檔,再進入遊戲就會顯示退出之前的狀態。示例 遊戲發起人類 public class game public state cr...