最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解備忘錄模式及其在Java設計模式編程中的實現(xiàn)

 更新時間:2016年04月29日 09:36:04   作者:匆忙擁擠repeat  
這篇文章主要介紹了詳解備忘錄模式及其在Java設計模式編程中的實現(xiàn),備忘錄模式數(shù)據(jù)的存儲過程中應當注意淺拷貝和深拷貝的問題,需要的朋友可以參考下

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

2. 使用的原因
想要恢復對象某時的原有狀態(tài)。

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

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

201642993348501.jpg (466×148)

(2)類說明           
(i)Memento:備忘錄角色,  主要負責的工作如下:
將發(fā)起人對象的內(nèi)部狀態(tài)存儲起來;
可以保護其內(nèi)容不被發(fā)起人(Originator)對象之外的任何對象所讀取。
(ii)Originator:發(fā)起人角色,主要完成如下工作:
創(chuàng)建一個含有當前的內(nèi)部狀態(tài)的備忘錄對象;
使用備忘錄對象存儲其內(nèi)部狀態(tài)。
(iii)Caretaker:負責人角色,完成工作如下:
負責保存?zhèn)渫泴ο螅?br /> 不保存?zhèn)渫泴ο蟮膬?nèi)容。      

5.實例

/** 
 * 數(shù)據(jù)對象 
 */ 
public class DataState { 
  private String action; 
 
  public void setAction(String action) { 
    this.action = action; 
  } 
   
  public String getAction() { 
    return action; 
  } 
 
} 
/** 
 * 一個保存另外一個對象內(nèi)部狀態(tài)拷貝 的對象.這樣以后就可以將該對象恢復到原先保存的狀態(tài). 
 */ 
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() { 
 
  } 
 
  // 創(chuàng)建一個Memento,將自身作為參數(shù)傳入 
  public Memento getMemento() { 
    return new Memento(this); 
  } 
 
  // 從Memento中取出保存的數(shù)據(jù),恢復為原始狀態(tài) 
  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; 
  } 
   
  // 創(chuàng)建一個Memento,將自身作為參數(shù)傳入 
  public Memento getMemento() { 
    return new Memento(this); 
  } 
   
  // 從Memento中取出保存的數(shù)據(jù),恢復為原始狀態(tài) 
  public void setMemento(Memento m) { 
    /* 
     * getMemento() 創(chuàng)建的對象,保存在某個容器里, 
     * 當需要恢復時,將其傳入當前方法, 再使用getState(),得出 
     */ 
    this.state = m.getState(); 
  } 
   
  public DataState getState() { 
    return state; 
  } 
   
  public void setState(DataState state) { 
    this.state = state; 
  } 
} 

/* 
 * Originator用于 加載數(shù)據(jù), 建立Memento對象,及通過Memento恢復原始數(shù)據(jù) 
 */ 
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("創(chuàng)建原始數(shù)據(jù)"); 
    originator.setState(state); 
     
    System.out.println("創(chuàng)建備忘錄對象, 保存原始數(shù)據(jù)狀態(tài)"); 
    Memento memento = originator.getMemento(); 
     
    System.out.println("創(chuàng)建了一個新數(shù)據(jù)"); 
    originator.setState(new DataState()); 
 
    System.out.println("創(chuàng)建新數(shù)據(jù)后:" + originator.getState().getAction()); 
     
    /* 
     * memento 需要保存在某地,需要時取出,以恢復它內(nèi)部所保存的數(shù)據(jù) 
     */ 
    System.out.println("創(chuàng)建新數(shù)據(jù)后,恢復原數(shù)據(jù)"); 
    originator.setMemento(memento); 
    System.out.println(originator.getState().getAction()); 
  } 
} 

打印:

創(chuàng)建原始數(shù)據(jù) 
創(chuàng)建備忘錄對象, 保存原始數(shù)據(jù)狀態(tài) 
創(chuàng)建了一個新數(shù)據(jù) 
創(chuàng)建新數(shù)據(jù)后:null 
創(chuàng)建新數(shù)據(jù)后,恢復原數(shù)據(jù) 
copy a character 

相關文章

  • 模仿Spring手寫一個簡易的IOC

    模仿Spring手寫一個簡易的IOC

    這篇文章主要介紹了模仿Spring手寫一個簡易的IOC,幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下
    2020-11-11
  • Java反射機制的學習總結

    Java反射機制的學習總結

    總的來說,java反射機制是一個很好用的東西,用它可以解決很多死的東西,因為反射機制的靈活行很大,有了他,我們就不要花太多的時間來寫操做數(shù)據(jù)庫的代碼了,而是方法更多的時間在項目的邏輯功能上,這個可以很大的減少開發(fā)時間,而且代碼的可讀性好
    2013-09-09
  • java用LocalDateTime類獲取當天時間、前一天時間及本周/本月的開始和結束時間

    java用LocalDateTime類獲取當天時間、前一天時間及本周/本月的開始和結束時間

    這篇文章主要給大家介紹了關于java使用LocalDateTime類獲取當天時間、前一天時間及本周/本月的開始和結束時間的相關資料,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • SpringBoot整合jasypt進行重要數(shù)據(jù)加密的操作代碼

    SpringBoot整合jasypt進行重要數(shù)據(jù)加密的操作代碼

    Jasypt(Java?Simplified?Encryption)是一個專注于簡化Java加密操作的開源工具,它提供了一種簡單而強大的方式來處理數(shù)據(jù)的加密和解密,使開發(fā)者能夠輕松地保護應用程序中的敏感信息,本文給大家介紹了SpringBoot整合jasypt進行重要數(shù)據(jù)加密,需要的朋友可以參考下
    2024-05-05
  • Java枚舉類使用場景及實例解析

    Java枚舉類使用場景及實例解析

    這篇文章主要介紹了Java枚舉類使用場景及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 一文帶你搞懂Java類加載機制

    一文帶你搞懂Java類加載機制

    Java?類加載機制是?Java?運行時的核心組成部分,負責在程序運行過程中動態(tài)加載和連接類文件,并將其轉換為可執(zhí)行代碼,接下來小編就來帶大家搞懂面試官老問的?Java?類加載機制,需要的朋友可以參考下
    2023-08-08
  • java結合prometheus如何實現(xiàn)自定義數(shù)據(jù)監(jiān)控

    java結合prometheus如何實現(xiàn)自定義數(shù)據(jù)監(jiān)控

    文章介紹了如何配置Prometheus監(jiān)控系統(tǒng),包括配置文件prometheus.yml、被監(jiān)控應用的指標暴露配置以及自定義監(jiān)控指標的實現(xiàn),同時,還詳細說明了監(jiān)控應用如何通過Prometheus API獲取數(shù)據(jù)、處理數(shù)據(jù)并返回結果
    2024-12-12
  • java短路邏輯運算符實例用法詳解

    java短路邏輯運算符實例用法詳解

    在本篇文章里小編給大家分享的是一篇關于java短路邏輯運算符實例用法內(nèi)容,有需要的朋友們可以學習參考下。
    2021-04-04
  • Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)

    Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)

    這篇文章主要介紹了Java爬蟲Jsoup+httpclient獲取動態(tài)生成的數(shù)據(jù)的相關資料,需要的朋友可以參考下
    2017-05-05
  • 淺談java字符串比較到底應該用==還是equals

    淺談java字符串比較到底應該用==還是equals

    這篇文章主要介紹了淺談java字符串比較到底應該用==還是equals,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12

最新評論

田东县| 湖州市| 建德市| 尚志市| 尉犁县| 宿州市| 江油市| 甘德县| 黔江区| 兴海县| 浙江省| 宜宾县| 镇雄县| 赤峰市| 平定县| 仁化县| 荔浦县| 杂多县| 屏东市| 嘉峪关市| 镶黄旗| 昌黎县| 巴楚县| 云南省| 和田县| 合江县| 沂南县| 沈丘县| 宁德市| 长阳| 浪卡子县| 上高县| 遵化市| 抚顺县| 安龙县| 中宁县| 宜章县| 鄂伦春自治旗| 高州市| 平陆县| 禄丰县|