第0章:簡介
備忘錄模式定義:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態
備忘錄模式本質:保存和恢復內部狀態
參考:研磨設計模式(書籍),大話設計模式(書籍)
模式圖:
待補充
第1章:實踐
(1)備忘錄接口(Memento.java)
package com.mcc.core.designPattern.behavior.memento; /** * 備忘錄接口,窄接口,即沒有任何方法定義的空接口 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-16 下午10:50 */ public interface Memento { //空接口 } |
(2)原發器對象(Originator.java)
package com.mcc.core.designPattern.behavior.memento; /** * 原發器對象,即使用備忘錄保存和恢復自身狀態的對象 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-16 下午10:52 */ public class Originator { //原發器的狀態數據 private Integer data = 0; /** * 獲取原生器數據 * @return */ public Integer getData() { return data; } /** * 數據寫入備忘錄。創建備忘錄對象並保存原發器的狀態數據,數據的中間態,後面需再次用到此狀態下得數據 * @return */ public Memento createMemento(){ return new MementoImpl(data); } /** * 讀取備忘錄數據。重新設置原發器的的數據爲中間態數據,原發器重回到寫入備忘錄時的狀態 */ public void resetData(Memento memento){ //獲得備忘錄 MementoImpl mementoImpl = (MementoImpl)memento; //用備忘錄數據重置原發器數據 this.data = mementoImpl.getStateData(); } /** * 流程1,公共流程,此流程產生的數據將記錄進備忘錄,供後面不同流程分支重複使用 */ public void methodStep1(){ data = data + 5; } /** * 流程2的A分支,分支流程,需用到流程1產生的數據,即備忘錄中的數據 */ public void methodStep2A(){ data = data + 10; } /** * 流程2的B分支,分支流程,需用到流程1產生的數據,即備忘錄中的數據 */ public void methodStep2B(){ data = data * 10; } /** * 備忘錄對象,用了保存原發器的中間態數據,是私有的類級內部類,不讓外部直接訪問 */ private static class MementoImpl implements Memento{ //狀態數據,是原發器某一時刻的中間態數據 private Integer stateData = null; /** * 構造器,傳入中間態數據 * @param stateData */ public MementoImpl(Integer stateData){ this.stateData = stateData; } /** * 創建後,一般外部不能再修改數據,只能讀取數據,所以沒有相應的setter方法 * @return */ public Integer getStateData(){ return stateData; } } } |
(3)備忘錄管理者(MenentoTaker.java)
package com.mcc.core.designPattern.behavior.memento; /** * 備忘錄持有者,用了保存備忘錄 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-16 下午11:41 */ public class MenentoTaker { //持有備忘錄對象 private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } } |
(4)客戶端測試(Client.java)
package com.mcc.core.designPattern.behavior.memento; /** * 客戶端測試 * * @author <a href="mailto:[email protected]">menergy</a> * DateTime: 14-3-16 下午11:48 */ public class Client { public static void main(String args[]){ //原生器 Originator originator = new Originator(); System.out.println("運行流程1,原生數據初始化爲0,流程將數據加5"); originator.methodStep1(); //創建備忘錄,記錄中間態數據 Memento memento = originator.createMemento(); //將備忘錄交給備忘錄管理者管理 MenentoTaker menentoTaker = new MenentoTaker(); menentoTaker.setMemento(memento); System.out.println("流程1完成,原生數據爲:" + originator.getData()); //從備忘錄管理者中獲取備忘錄 Memento memento2A = menentoTaker.getMemento(); //重置原生器數據爲備忘錄數據 originator.resetData(memento2A); System.out.println("重置原生器數據爲:" + originator.getData()); System.out.println("運行流程2的A分支,流程將加10"); //運行流程2的A分支 originator.methodStep2A(); System.out.println("流程2的A分支完成,原生數據爲" + originator.getData()); //從備忘錄管理者中獲取備忘錄 Memento memento2B = menentoTaker.getMemento(); //重置原生器數據爲備忘錄數據 originator.resetData(memento2B); System.out.println("重置原生器數據爲:" + originator.getData()); System.out.println("運行流程2的B分支,流程將乘以10"); //運行流程2的B分支 originator.methodStep2B(); System.out.println("流程2的B分支完成,原生數據爲" + originator.getData()); } } |