前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解设计模式:备忘录模式

详解设计模式:备忘录模式

作者头像
栗筝i
发布2022-12-06 13:55:46
3210
发布2022-12-06 13:55:46
举报
文章被收录于专栏:迁移内容

详解设计模式:备忘录模式

备忘录模式(Memento Pattern)也被称为快照模式(Snapshot Pattern)、Token 模式(Token Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 备忘录模式 会保存一个对象的某个状态,以便在适当的时候恢复对象。 备忘录模式 在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 ~ 本篇文章内容包括:关于备忘录模式、备忘录模式 Demo(伪代码)


文章目录


一、关于备忘录模式

1、关于备忘录模式

备忘录模式(Memento Pattern)也被称为快照模式(Snapshot Pattern)、Token 模式(Token Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

备忘录模式 会保存一个对象的某个状态,以便在适当的时候恢复对象。

备忘录模式 在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2、关于备忘录模式的构成

备忘录模式主要包含以下 3 种角色:

  • 发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能
  • 备忘录角色(Memento):用于存储 Originator 的内部状态,可以防止 Originator 以外的对象访问
  • 备忘录管理员角色(Caretaker):负责存储。提供管理员备忘录,无法对备忘录内容进行操作和访问
3、关于备忘录模式的UML
在这里插入图片描述
在这里插入图片描述
4、关于备忘录模式的适用场景
  • 撤销操作 : 保存 / 恢复 数据 的相关业务场景 ; 如 : 在 Word 中编写文档 , 如果想要撤销之前的 输入 / 删除操作 , 使用 Ctrl + Z 执行 " 撤销 " 操作 ;
  • 状态恢复 : 在 " 后悔 " 的时候 , 将对象恢复到之前的状态 ; 如 : 游戏中的存档使用 。
5、关于备忘录模式的优缺点

# 备忘录模式的优点

  • 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
  • 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
  • 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

# 备忘录模式的缺点:

  • 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  • 当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  • 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

二、备忘录模式 Demo(伪代码)

1、伪代码 Demo 实现

# Originator 发起人角色

代码语言:javascript
复制
public class Originator {

    /**
     * 内部状态
     */
    private String state;

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

    /**
     * 创建一个备忘录
     * @return Memento
     */
    public Memento createMemento() {
        return new Memento(this.state);
    }

    /**
     * 从备忘录恢复
     * @param memento Memento
     */
    public void restoreMemento(Memento memento) {
        this.setState(memento.getState());
    }
}

# Memento 备忘录角色

代码语言:javascript
复制
public class Memento {

    private String state;

    public Memento(String state){
        this.state = state;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

# Caretaker 备忘录管理员角色

代码语言:javascript
复制
public class Caretaker {

    /**
     * 备忘录对象
     */
    private Memento memento;

    public Memento getMemento() {
        return this.memento;
    }

    public void storeMemento(Memento memento) {
        this.memento = memento;
    }
}
2、Demo 测试
代码语言:javascript
复制
public class Client {

    public static void main(String[] args) {
        //来一个发起人
        Originator originator = new Originator();
        originator.setState("状态1");
        System.out.println(originator.getState());
        //来一个备忘录管理员
        Caretaker caretaker = new Caretaker();
        //管理员存储发起人的备忘录
        caretaker.storeMemento(originator.createMemento());
        originator.setState("状态2");

        System.out.println(originator.getState());
        //管理员存储发起人的备忘录
        caretaker.storeMemento(originator.createMemento());
        originator.setState("状态3");
        System.out.println(originator.getState());

        //发起人从管理员获取备忘录进行回滚
        originator.restoreMemento(caretaker.getMemento());

        System.out.println(originator.getState());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 详解设计模式:备忘录模式
    • 文章目录
      • 一、关于备忘录模式
        • 二、备忘录模式 Demo(伪代码)
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档