abstrak:原理備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉(Capture)住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。組成 備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發(fā)起人(Originator)角色、負責人(Caretaker)角
原理
備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉(Capture)住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。
組成
備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發(fā)起人(Originator)角色、負責人(Caretaker)角色。
備忘錄(Memento)角色又如下責任:
?。?)將發(fā)起人(Originator)對象的內(nèi)戰(zhàn)狀態(tài)存儲起來。備忘錄可以根據(jù)發(fā)起人對象的判斷來決定存儲多少發(fā)起人(Originator)對象的內(nèi)部狀態(tài)。
?。?)備忘錄可以保護其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。
發(fā)起人(Originator)角色有如下責任:
?。?)創(chuàng)建一個含有當前的內(nèi)部狀態(tài)的備忘錄對象。
?。?)使用備忘錄對象存儲其內(nèi)部狀態(tài)。
負責人(Caretaker)角色有如下責任:
?。?)負責保存?zhèn)渫泴ο蟆?/p>
?。?)不檢查備忘錄對象的內(nèi)容。
“自述歷史”模式
所謂“自述歷史”模式(History-On-Self Pattern)實際上就是備忘錄模式的一個變種。在備忘錄模式中,發(fā)起人(Originator)角色、負責人(Caretaker)角色和備忘錄(Memento)角色都是獨立的角色。雖然在實現(xiàn)上備忘錄類可以成為發(fā)起人類的內(nèi)部成員類,但是備忘錄類仍然保持作為一個角色的獨立意義。在“自述歷史”模式里面,發(fā)起人角色自己兼任負責人角色。
“自述歷史”模式的類圖如下所示:
備忘錄角色有如下責任:
(1)將發(fā)起人(Originator)對象的內(nèi)部狀態(tài)存儲起來。
?。?)備忘錄可以保護其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。
發(fā)起人角色有如下責任:
?。?)創(chuàng)建一個含有它當前的內(nèi)部狀態(tài)的備忘錄對象。
?。?)使用備忘錄對象存儲其內(nèi)部狀態(tài)。
客戶端角色有負責保存?zhèn)渫泴ο蟮呢熑巍?/p>
源代碼
窄接口MementoIF,這是一個標識接口,因此它沒有定義出任何的方法。
public interface MementoIF { }
發(fā)起人角色同時還兼任負責人角色,也就是說它自己負責保持自己的備忘錄對象?!?nbsp;
public class Originator { public String state; /** * 改變狀態(tài) */ public void changeState(String state){ this.state = state; System.out.println("狀態(tài)改變?yōu)椋?quot; + state); } /** * 工廠方法,返還一個新的備忘錄對象 */ public Memento createMemento(){ return new Memento(this); } /** * 將發(fā)起人恢復到備忘錄對象所記錄的狀態(tài)上 */ public void restoreMemento(MementoIF memento){ Memento m = (Memento)memento; changeState(m.state); } private class Memento implements MementoIF{ private String state; /** * 構(gòu)造方法 */ private Memento(Originator o){ this.state = o.state; } private String getState() { return state; } } }
客戶端角色類
public class Client { public static void main(String[] args) { Originator o = new Originator(); //修改狀態(tài) o.changeState("state 0"); //創(chuàng)建備忘錄 MementoIF memento = o.createMemento(); //修改狀態(tài) o.changeState("state 1"); //按照備忘錄恢復對象的狀態(tài) o.restoreMemento(memento); } }
由于“自述歷史”作為一個備忘錄模式的特殊實現(xiàn)形式非常簡單易懂,它可能是備忘錄模式最為流行的實現(xiàn)形式。