【设计模式】—— 备忘录模式Memento

  前言:【模式总览】——————————by xingoo

  模式意图

  这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复。

  该模式还有跟多可以扩展的地方,比如可以记录多个时间的状态,每个角色都有可以扩展的空间,完全看业务场景而定。

  应用场景

  1 保存对象某一时刻的状态

  2 避免直接暴露接口,破坏封装性

  模式结构

  Originator 是备忘录的发起者,记录状态的对象

class Originator{
    private String state;
    public Memento ceateMemento() {
        return new Memento(state);
    }
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
    public String getState(){
        return this.state;
    }
    public void setState(String state){
        this.state = state;
        System.out.println("Current state = "+this.state);
    }
}

  Memento 备忘录角色,通常用于保存某种状态

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

  Caretaker 备忘录的负责人,负责在恰当的时机,进行状态的恢复

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

  全部代码

package com.xingoo.test.design.memento;
class Originator{
    private String state;
    public Memento ceateMemento() {
        return new Memento(state);
    }
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
    public String getState(){
        return this.state;
    }
    public void setState(String state){
        this.state = state;
        System.out.println("Current state = "+this.state);
    }
}
class Memento{
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
class Caretaker{
    private Memento memento;
    public Memento retrieveMemento(){
        return this.memento;
    }
    public void saveMemento(Memento memento){
        this.memento = memento;
    }
}
public class Client {
    private static Originator o = new Originator();
    private static Caretaker c = new Caretaker();
    public static void main(String[] args) {
        o.setState("On");
        //记录状态
        c.saveMemento(o.ceateMemento());
        //更改状态
        o.setState("Off");
        //更新状态
        o.restoreMemento(c.retrieveMemento());
    }
}

  运行结果

Current state = On
Current state = Off

  生活中的设计模式

  最近看了会 恶魔奶爸,挺扯淡的漫画。不过看到其中的女仆,让我想起了这种备忘录模式。

  主人在有什么重要的事情时,都会交给女仆记着,规定的时间在提醒自己。

  下面的主人就有一件很重要的事情,就是陪亲爱的小丽去看电影,于是他弄了一个笔记本,记录下了这个信息。女仆拿到笔记本,并在预先商量好的时间提醒主人。这里的笔记本就是上面的备忘录对象Memento,而这个模式中,主人就是备忘录的发起者,女仆是负责人。

  这里涉及到的备忘录是属于【白箱】的,也就是说,备忘录中的信息,可以被发起人和负责人看到。还有一种是【黑箱】的,主要是用了一种内部类继承这个备忘录对象,这样外部的负责人就得不到真正备忘录中的具体信息

  下面看下具体的实现,主人的代码如下:

 1 class Master{
 2     private String info;
 3     public String getInfo() {
 4         return info;
 5     }
 6     public void setInfo(String info) {
 7         this.info = info;
 8     }
 9     public Note createNote(String info){
10         return new Note(info);
11     }
12     public void action(Note note){
13         this.info = note.getInfo();
14         System.out.println("主人看到笔记,记起了 "+ this.info);
15     }
16     public void toDo(){
17         System.out.println("****主人正在..."+info);
18     }
19 }

  女仆的代码如下:

 1 class Maid{
 2     private Note note;
 3     public Note readNote(){
 4         System.out.println("女仆拿到笔记本");
 5         return this.note;
 6     }
 7     public void writeNote(Note note){
 8         System.out.println("女仆写笔记");
 9         this.note = note;
10     }
11 }

  备忘录的代码如下:

 1 class Note{
 2     private String info;
 3     public Note(String info) {
 4         this.info = info;
 5     }
 6     public void setInfo(String info){
 7         this.info = info;
 8         System.out.println("写笔记!");
 9     }
10     public String getInfo(){
11         System.out.println("读笔记!");
12         return info;
13     }
14 }

  全部代码:

 1 package com.xingoo.test.design.memento;
 2 class Note{
 3     private String info;
 4     public Note(String info) {
 5         this.info = info;
 6     }
 7     public void setInfo(String info){
 8         this.info = info;
 9         System.out.println("写笔记!");
10     }
11     public String getInfo(){
12         System.out.println("读笔记!");
13         return info;
14     }
15 }
16 class Master{
17     private String info;
18     public String getInfo() {
19         return info;
20     }
21     public void setInfo(String info) {
22         this.info = info;
23     }
24     public Note createNote(String info){
25         return new Note(info);
26     }
27     public void action(Note note){
28         this.info = note.getInfo();
29         System.out.println("主人看到笔记,记起了 "+ this.info);
30     }
31     public void toDo(){
32         System.out.println("****主人正在..."+info);
33     }
34 }
35 class Maid{
36     private Note note;
37     public Note readNote(){
38         System.out.println("女仆拿到笔记本");
39         return this.note;
40     }
41     public void writeNote(Note note){
42         System.out.println("女仆写笔记");
43         this.note = note;
44     }
45 }
46 public class LifeWithMaid {
47     public static void main(String[] args) {
48         Master master = new Master();
49         Maid maid = new Maid();
50         //主人想起了要做的事情
51         maid.writeNote(master.createNote("晚上6点,配小丽看电影"));
52         //主人忙其他的事情
53         master.setInfo("睡觉吃饭打豆豆!");
54         master.toDo();//主人正在做什么?
55         //时间到了,女仆提醒主人
56         master.action(maid.readNote());
57         master.toDo();//主人正在做什么?
58     }
59 }    

  运行结果

女仆写笔记
****主人正在...睡觉吃饭打豆豆!
女仆拿到笔记本
读笔记!
主人看到笔记,记起了 晚上6点,配小丽看电影
****主人正在...晚上6点,配小丽看电影
时间: 2024-08-19 13:10:17

【设计模式】—— 备忘录模式Memento的相关文章

[工作中的设计模式]备忘录模式memento

一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式可以根据客户指令,将相应的对象特有属性进行快照,如果客户要恢复对象,则根据快照提供的特有属性进行还原. 二.模式代码 package memento.patten; /** *备忘录类,同时指定要保存的对象属性

[设计模式] 备忘录模式Memento Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 类图和实例: 简单的模式实例: #include <iostream> #include <string> using namespace std; class Memento { private:     string state; public:     Memento(

设计模式之备忘录模式(Memento)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式入门之备忘录模式Memento

//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就可以将该对象恢复到原先保存的状态 //实例:测试两种方案,两种方案在第一阶段的过程是相同的,第二阶段是不同的 //实例代码 //备忘录对象的窄接口 public interface FlowAMockMemento { //空的,所谓窄接口,即只是一个标识作用,它的持有者不可以调用任何它的方法 } //测试流程类 public class FlowAMock { private

设计模式(行为型)之备忘录模式(Memento Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之中介者模式(Mediator Pattern)>http://blog.csdn.net/yanbober/article/details/45533335 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无

深入浅出设计模式——备忘录模式(Memento Pattern)

模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态.现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题. 在应用软件的开发过程中,很多时候我们都需要记录一个对象的内部状态.在具体实现过程中,为了允许用户取消不确定的操作或从错误中恢复过来,需要实现备份点和撤销机制,而要实现这些机制

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.备忘录模式的结构和角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态. 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问

我的设计模式:备忘录模式

我的设计模式-备忘录模式 恢复到最初的状态-->对原始状态的保留和恢复 联想到的业务:cms稿件放入到回收站,永久记录状态得用到数据库啊,怎么办?备忘录模式的内存缓存不适用? 类的单一职责 boy职责:状态   改变状态  设置状态  获取状态 备忘录职责:记录当前的状态   恢复状态 迪 米特原则:最少知道原则,不和陌生人说话 问题:备忘录只是记录了一个节点,多个备忘录记录了多个节点,可以恢复到任意节点?备忘录因该支持多个节点? 思考问题:增加备忘录管理者manager角色,有啥好处呢?没体验

[转] Android中的设计模式-备忘录模式

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern)用来恢复一个对象的状态到以前的状态. 备忘录模式下属于行为模式的类别. 实现实例 在这个示例中,备忘录模式(Memento Pattern)使用三个操作者类. Memento类中包含要恢复的对象的状态. 创建者在Memento对象中创建和存储状态,Caretaker对象负责从Memento中恢复对象状态.在这个示例中,创建了以下几个类:Memento,Originator和CareTaker. MementoPatternDemo这是一个演示类,它将使