memento-備忘錄模式

解決問題

備忘錄模式-即對象的狀態(tài)記錄在備忘錄中,以方便可以將在未來的某一時刻或者某一狀態(tài)中將對象恢復至歷史的某一狀態(tài)蝙眶。

應用場景

在某種狀態(tài)下需要回滾到之前的狀態(tài)季希。這種應用場景很多:編輯器的自動保存與恢復功能;事務中的回滾機制幽纷;各操作平臺的回退功能等式塌。

原理圖

image

Caretaker: 守護者

Originator:起源,即需要被 “備忘”的對象

Memento:備忘錄

“守護者”保護持有操作“起源”友浸,令其生產“備忘錄”峰尝,并操作多個“備忘錄”以方便“起源”回滾(我認為該原理圖有問題,如果認為我理解有誤請留言)

我的理解是這樣的:

備忘錄不能由“Originator” 以外的任何對象生成收恢,也不可被“Originator”以外的任何對象修改武学;因此,“Memento”應該是“Originator”的一個私有的內部類伦意,否則的話前提條件不成立火窒。

“Caretaker” 應該是持有“Originator”,因為它的作用范圍是操作對象狀態(tài)的變更默赂、生產備忘記錄(也可以自動生產)沛鸵、回滾。

image

示例

比較簡單的示例缆八,直接用原理圖來代表示例

@Data
@AllArgsConstructor
public class Originator {
    private int state;
    private static Stack<Memento> mementos = new Stack<>();
?
    public void save() {
        mementos.push(new Memento(state));
    }
?
    public boolean rollback() {
        if (mementos.isEmpty()) {
            System.out.println("無歷史記錄");
            return false;
        } else {
            this.state = mementos.pop().getState();
            System.out.println(this.state);
            return true;
        }
    }
?
    @Data
    @AllArgsConstructor
    private static class Memento {
        private int state;
    }
}
?
?
public class CareTaker {
    public static void main(String[] args) {
        Originator originator = new Originator(0);
        originator.save();
        originator.setState(1);
        originator.save();
        originator.setState(2);
        originator.save();
        // 多次回滾
        while (originator.rollback()) {
          ;
        }
    }
}

參考

https://en.wikipedia.org/wiki/Memento_pattern

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末曲掰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奈辰,更是在濱河造成了極大的恐慌栏妖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奖恰,死亡現(xiàn)場離奇詭異吊趾,居然都是意外死亡,警方通過查閱死者的電腦和手機瑟啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門论泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛹屿,你說我怎么就攤上這事屁奏。” “怎么了错负?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵坟瓢,是天一觀的道長勇边。 經常有香客問我,道長折联,這世上最難降的妖魔是什么粒褒? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮诚镰,結果婚禮上奕坟,老公的妹妹穿的比我還像新娘。我一直安慰自己怕享,他們只是感情好执赡,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布镰踏。 她就那樣靜靜地躺著函筋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奠伪。 梳的紋絲不亂的頭發(fā)上跌帐,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音绊率,去河邊找鬼谨敛。 笑死,一個胖子當著我的面吹牛滤否,可吹牛的內容都是我干的脸狸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼藐俺,長吁一口氣:“原來是場噩夢啊……” “哼炊甲!你這毒婦竟也來了?” 一聲冷哼從身側響起欲芹,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卿啡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菱父,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颈娜,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年浙宜,在試婚紗的時候發(fā)現(xiàn)自己被綠了官辽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粟瞬,死狀恐怖同仆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情亩钟,我是刑警寧澤乓梨,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布鳖轰,位于F島的核電站,受9級特大地震影響扶镀,放射性物質發(fā)生泄漏蕴侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一臭觉、第九天 我趴在偏房一處隱蔽的房頂上張望昆雀。 院中可真熱鬧,春花似錦蝠筑、人聲如沸狞膘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挽封。三九已至,卻和暖如春臣镣,著一層夾襖步出監(jiān)牢的瞬間辅愿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工忆某, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留点待,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓弃舒,卻偏偏與公主長得像癞埠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子聋呢,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容