備忘錄模式是非常簡單的一種模式,應用場景非常廣泛,如編輯器的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...