国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解備忘錄模式及其在Java設計模式編程中的實現

2019-11-26 14:24:14
字體:
來源:轉載
供稿:網友

1. 定義
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。

2. 使用的原因
想要恢復對象某時的原有狀態。

3. 適用的情況舉例
有很多備忘錄模式的應用,只是我們已經見過,卻沒細想這是備忘錄模式的使用罷了,略略舉幾例:
eg1. 備忘錄在jsp+javabean的使用:
在一系統中新增帳戶時,在表單中需要填寫用戶名、密碼、聯系電話、地址等信息,如果有些字段沒有填寫或填寫錯誤,當用戶點擊“提交”按鈕時,需要在新增頁面上保存用戶輸入的選項,并提示出錯的選項。這就是利用JavaBean的scope="request"或scope="session"特性實現的,即是用備忘錄模式實現的。
eg2. 修理汽車的剎車時。首先移開兩邊的擋板,露出左右剎車片。只能卸下一片,這時另一片作為一個備忘錄來表明剎車是怎樣安裝的。在這片修理完成后,才可以卸下另一片。當第二片卸下時,第一片就成了備忘錄。
eg3. 都說人生沒有后悔藥可買,我們都在為所做的事付出著代價,但在軟世界里卻有“后悔藥”,我改變了某東西的某些狀態之后,只要我們之前保存了該東西的某狀態,我們就可以通過備忘錄模式實現該東西的狀態還原,其實這何嘗不是一個能使時光倒流的“月光寶盒”,總“神奇”一詞了得。

4. 類圖結構及說明
(1)類圖如下所示:

201642993348501.jpg (466×148)

(2)類說明           
(i)Memento:備忘錄角色,  主要負責的工作如下:
將發起人對象的內部狀態存儲起來;
可以保護其內容不被發起人(Originator)對象之外的任何對象所讀取。
(ii)Originator:發起人角色,主要完成如下工作:
創建一個含有當前的內部狀態的備忘錄對象;
使用備忘錄對象存儲其內部狀態。
(iii)Caretaker:負責人角色,完成工作如下:
負責保存備忘錄對象;
不保存備忘錄對象的內容。      

5.實例

/**  * 數據對象  */ public class DataState {   private String action;    public void setAction(String action) {     this.action = action;   }      public String getAction() {     return action;   }  } 
/**  * 一個保存另外一個對象內部狀態拷貝 的對象.這樣以后就可以將該對象恢復到原先保存的狀態.  */ import java.io.File; import java.io.Serializable;  public class Memento implements Serializable {    /*private int number;   private File file = null;    public Memento(Originator o) {     this.number = o.getNumber();     this.file = o.getFile();   }    public int getNumber() {     return this.number;   }    public void setNumber(int number) {     this.number = number;   }    public File getFile() {     return this.file;   }    public void setFile(File file) {     this.file = file;   } */   private DataState state;   public Memento(Originator o) {     this.state = o.getState();   }      public DataState getState() {     return state;   }      public void setState(DataState state) {     this.state = state;   } } 
public class Originator {  /* private int number;   private File file = null;    public Originator() {    }    // 創建一個Memento,將自身作為參數傳入   public Memento getMemento() {     return new Memento(this);   }    // 從Memento中取出保存的數據,恢復為原始狀態   public void setMemento(Memento m) {     number = m.getNumber();     file = m.getFile();   }    public int getNumber() {     return number;   }    public void setNumber(int number) {     this.number = number;   }    public File getFile() {     return file;   }    public void setFile(File file) {     this.file = file;   }*/      private DataState state;   public Originator() {        }      public Originator(DataState state) {     this.state = state;   }      // 創建一個Memento,將自身作為參數傳入   public Memento getMemento() {     return new Memento(this);   }      // 從Memento中取出保存的數據,恢復為原始狀態   public void setMemento(Memento m) {     /*      * getMemento() 創建的對象,保存在某個容器里,      * 當需要恢復時,將其傳入當前方法, 再使用getState(),得出      */     this.state = m.getState();   }      public DataState getState() {     return state;   }      public void setState(DataState state) {     this.state = state;   } } 
/*  * Originator用于 加載數據, 建立Memento對象,及通過Memento恢復原始數據  */ public class Test {   public static void main(String[] args) {      //   Originator originator = new Originator(); //   originator.setNumber(8); //    //   Memento memento = originator.getMemento(); //   System.out.println(memento.getNumber());          DataState state = new DataState();     state.setAction("copy a character");     Originator originator = new Originator();     System.out.println("創建原始數據");     originator.setState(state);          System.out.println("創建備忘錄對象, 保存原始數據狀態");     Memento memento = originator.getMemento();          System.out.println("創建了一個新數據");     originator.setState(new DataState());      System.out.println("創建新數據后:" + originator.getState().getAction());          /*      * memento 需要保存在某地,需要時取出,以恢復它內部所保存的數據      */     System.out.println("創建新數據后,恢復原數據");     originator.setMemento(memento);     System.out.println(originator.getState().getAction());   } } 

打印:

創建原始數據 創建備忘錄對象, 保存原始數據狀態 創建了一個新數據 創建新數據后:null 創建新數據后,恢復原數據 copy a character 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云和县| 磴口县| 大关县| 乐昌市| 河津市| 邹平县| 阳西县| 社旗县| 衢州市| 灵山县| 英超| 抚远县| 凌海市| 屏南县| 衡东县| 滦南县| 墨脱县| 蒲江县| 新干县| 右玉县| 时尚| 长汀县| 乌兰县| 甘泉县| 政和县| 澄迈县| 万全县| 麻城市| 曲靖市| 乐山市| 龙门县| 郯城县| 新乡县| 普兰县| 武安市| 锦州市| 通海县| 兴业县| 曲水县| 灵寿县| 龙岩市|