設(shè)計(jì)模式之備忘錄模式(行為型)

[TOC]

一筋蓖、模式定義

備忘錄模式(Memento Pattern):備忘錄模式的定義是在不破壞封裝的前提下卸耘,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)退敦,并將該對(duì)象之外保存這個(gè)狀態(tài)粘咖,這樣可以在以后將對(duì)象恢復(fù)到原先保存的狀態(tài)。所以備忘錄模式就是一種對(duì)象行為型模式侈百。

二瓮下、模式角色

備忘錄模式包括下面角色

  • Originator(原發(fā)器)
  • Memento(備忘錄)
  • Caretaker(負(fù)責(zé)人)
在這里插入圖片描述

備忘錄模式包括原發(fā)器類翰铡,備忘錄類和負(fù)責(zé)人類。原發(fā)器可以創(chuàng)建一個(gè)備忘錄讽坏,備忘錄類存儲(chǔ)原發(fā)器類的內(nèi)部狀態(tài)锭魔,根據(jù)原發(fā)器來決定保存哪些內(nèi)部狀態(tài),負(fù)責(zé)人類負(fù)責(zé)保存?zhèn)渫?/p>

三路呜、模式分析

備忘錄模式主要應(yīng)用于備份或者回退操作迷捧,為了使軟件使用更友好,通常都有回退功能胀葱,軟件一般也要提供回退機(jī)制漠秋,而要實(shí)現(xiàn)回退,就必須事先備份好狀態(tài)信息抵屿,所以有了備忘錄模式就有實(shí)現(xiàn)系統(tǒng)回退到某一個(gè)特定的歷史狀態(tài)庆锦。

備忘錄對(duì)象用于存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照對(duì)象,所以備忘錄模式又可以稱之為快照模式(Snapshot Pattern)或Token模式

典型代碼:

原發(fā)器類:

public class Originator {
  private String state;
  public Originator(){}
  // 創(chuàng)建一個(gè)備忘錄對(duì)象
  public Memento createMemento(){
    return new Memento(this);
  }
  // 根據(jù)備忘錄對(duì)象恢復(fù)原發(fā)器狀態(tài)
  public void restoreMemento(Memento m){
     state = m.state;
    }
    public void setState(String state)
    {
        this.state=state;
    }
    public String getState()
    {
        return this.state;
    }
}

備忘錄類:

public class Memento {
  private String state;
  public Memento(Originator o){
    state = o.state;
    }
    public void setState(String state)
    {
          this.state=state;
    }
    public String getState()
    {
           return this.state;
     }
} 

負(fù)責(zé)人類:

import java.util.ArrayList;
import java.util.List;
 
public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();
 
   public void add(Memento state){
      mementoList.add(state);
   }
 
   public Memento get(int index){
      return mementoList.get(index);
   }
}

四轧葛、模式例子

實(shí)例:用戶信息操作撤銷
某系統(tǒng)提供了用戶信息操作模塊搂抒,用戶可以修改自己的各項(xiàng)信息。為了使操作過程更加人性化尿扯,現(xiàn)使用備忘錄模式對(duì)系統(tǒng)進(jìn)行改進(jìn)求晶,使得用戶在進(jìn)行了錯(cuò)誤操作之后可以恢復(fù)到操作之前的狀態(tài)。

本例子來自《設(shè)計(jì)模式》一書

原發(fā)器類姜胖,創(chuàng)建備忘錄類

package dp.memento;

public class UserInfoDTO
{
    private String account;
    private String password;
    private String telNo;
    
    public String getAccount()
    {
        return account;
    }
    
    public void setAccount(String account)
    {
        this.account=account;
    }

    public String getPassword()
    {
        return password;
    }
    
    public void setPassword(String password)
    {
        this.password=password;
    }
    
    public String getTelNo()
    {
        return telNo;
    }
    
    public void setTelNo(String telNo)
    {
        this.telNo=telNo;
    }
        
    public Memento saveMemento()
    {
        return new Memento(account,password,telNo);
    }
    
    public void restoreMemento(Memento memento)
    {
        this.account=memento.getAccount();
        this.password=memento.getPassword();
        this.telNo=memento.getTelNo();
    }
    
    public void show()
    {
        System.out.println("Account:" + this.account);
        System.out.println("Password:" + this.password);
        System.out.println("TelNo:" + this.telNo);      
    }
}

備忘錄類誉帅,保存原發(fā)器類狀態(tài):

package dp.memento;

class Memento
{
    private String account;
    private String password;
    private String telNo;
    
    public Memento(String account,String password,String telNo)
    {
        this.account=account;
        this.password=password;
        this.telNo=telNo;
    }
    public String getAccount()
    {
        return account;
    }
    
    public void setAccount(String account)
    {
        this.account=account;
    }

    public String getPassword()
    {
        return password;
    }
    
    public void setPassword(String password)
    {
        this.password=password;
    }
    
    public String getTelNo()
    {
        return telNo;
    }
        
    public void setTelNo(String telNo)
    {
        this.telNo=telNo;
    }
}

負(fù)責(zé)人類,創(chuàng)建備忘錄:

package dp.memento;

public class Caretaker
{
    private Memento memento;
    public Memento getMemento()
    {
        return memento;
    }
    public void setMemento(Memento memento)
    {
        this.memento=memento;
    }
}

五右莱、模式應(yīng)用

  • 軟件里的存檔操作
  • Windows 里的 ctri + z蚜锨。
  • IE 中的后退操作
  • 數(shù)據(jù)庫的事務(wù)管理
    ....
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慢蜓,隨后出現(xiàn)的幾起案子亚再,更是在濱河造成了極大的恐慌,老刑警劉巖晨抡,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛悬,死亡現(xiàn)場離奇詭異,居然都是意外死亡耘柱,警方通過查閱死者的電腦和手機(jī)如捅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來调煎,“玉大人镜遣,你說我怎么就攤上這事∈堪溃” “怎么了悲关?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵谎僻,是天一觀的道長。 經(jīng)常有香客問我寓辱,道長艘绍,這世上最難降的妖魔是什么秫筏? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任诱鞠,我火速辦了婚禮,結(jié)果婚禮上这敬,老公的妹妹穿的比我還像新娘般甲。我一直安慰自己,他們只是感情好鹅颊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布敷存。 她就那樣靜靜地躺著,像睡著了一般堪伍。 火紅的嫁衣襯著肌膚如雪锚烦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天帝雇,我揣著相機(jī)與錄音涮俄,去河邊找鬼。 笑死尸闸,一個(gè)胖子當(dāng)著我的面吹牛彻亲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吮廉,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼苞尝,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了宦芦?” 一聲冷哼從身側(cè)響起宙址,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎调卑,沒想到半個(gè)月后抡砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恬涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年注益,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯捆。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丑搔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情低匙,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布碳锈,位于F島的核電站顽冶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏售碳。R本人自食惡果不足惜强重,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贸人。 院中可真熱鬧间景,春花似錦、人聲如沸艺智。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十拣。三九已至封拧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夭问,已是汗流浹背泽西。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缰趋,地道東北人捧杉。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像秘血,于是被迫代替她去往敵國和親味抖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 開發(fā)仿真系統(tǒng)## 考慮這樣一個(gè)仿真應(yīng)用灰粮,功能是:模擬運(yùn)行針對(duì)某個(gè)具體問題的多個(gè)解決方案非竿,記...
    七寸知架構(gòu)閱讀 2,150評(píng)論 1 50
  • 1.初識(shí)備忘錄模式 在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)谋竖,并在該對(duì)象之外保存這個(gè)狀態(tài)红柱。這樣以后就可將該對(duì)...
    王偵閱讀 480評(píng)論 0 0
  • 1 意圖 在不破壞封裝性的前提下,捕獲了一個(gè)對(duì)象的內(nèi)部狀態(tài)蓖乘,并在該對(duì)象之外保存這個(gè)狀態(tài)锤悄。這樣以后就可以將該對(duì)象恢復(fù)...
    10xjzheng閱讀 506評(píng)論 0 0
  • 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述備忘錄(Memento)模式的:備忘錄模式又叫做快照模式(Sna...
    Ant_way閱讀 796評(píng)論 0 0
  • 覺的《昆池巖》不恐怖?那么就看這部《墓地邂逅》吧 這也是一部作死團(tuán)隊(duì)夜晚探險(xiǎn)鬧鬼精神病院的偽紀(jì)錄片嘉抒,整部電影雖然劇...
    SWein丹妮閱讀 1,045評(píng)論 0 0