備忘錄模式又叫作快照模式(Snapshot Pattern)或Token模式,是對象的行爲模式程序員
- 備忘錄對象是一個用來存儲另一個對象內部狀態的快照的對象
- 備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捕捉(Capture)住,並外部化,存儲起來,從而能夠在未來合適的時候把這個對象還原到存儲起來的狀態
- 備忘錄模式經常與命令模式和迭代子模式一同使用
![](http://static.javashuo.com/static/loading.gif)
「白箱」備忘錄模式的實現
- 備忘錄角色對任何對象都提供一個接口,即寬接口,備忘錄角色的內部所存儲的狀態就對全部對象公開。所以這個實現又叫作「白箱實現」。
- 「白箱」實現將發起人角色的狀態存儲在一個你們都看獲得的地方,所以是破壞封裝性的。可是經過程序員自律,一樣能夠在必定程度上實現模式的大部分用意。所以白箱實現仍然是有意義的。
![](http://static.javashuo.com/static/loading.gif)
「黑箱」備忘錄模式的實現
- 在JAVA語言中,實現雙重接口的辦法就是將備忘錄角色類設計成發起人角色類的內部成員類。
- 將Memento設成Originator類的內部類,從而將Memento對象封裝在Originator裏面;
- 在外部提供一個標識接口MementoIF給Caretaker以及其餘對象。
- 這樣,Originator類看到的是Menmento的全部接口,而Caretaker以及其餘對象看到的僅僅是標識接口MementoIF所暴露出來的接口。
多重檢查點
- 前面所給出的白箱和黑箱的示意性實現都是隻存儲一個狀態的簡單實現,也能夠叫作只有一個檢查點。常見的系統每每須要存儲不止一個狀態,而是須要存儲多個狀態,或者叫作有多個檢查點。
- 備忘錄模式能夠將發起人對象的狀態存儲到備忘錄對象裏面,備忘錄模式能夠將發起人對象恢復到備忘錄對象所存儲的某一個檢查點上。下面給出一個示意性的、有多重檢查點的備忘錄模式的實現。
![](http://static.javashuo.com/static/loading.gif)
「自述歷史」模式
- 所謂「自述歷史」模式(History-On-Self Pattern)實際上就是備忘錄模式的一個變種。
- 在備忘錄模式中,發起人(Originator)角色、負責人(Caretaker)角色和備忘錄(Memento)角色都是獨立的角色。
- 雖然在實現上備忘錄類能夠成爲發起人類的內部成員類,可是備忘錄類仍然保持做爲一個角色的獨立意義。
- 在「自述歷史」模式裏面,發起人角色本身兼任負責人角色。