备忘录模式(Memento)

这篇具有很好参考价值的文章主要介绍了备忘录模式(Memento)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

备忘录模式是一种行为设计模式,在不破坏封装性的前提下,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

Memento is a behavior design pattern. Without compromising encapsulation, 
it can reserve and restore of the previous state of an object, not exposing 
its implementation details.

结构设计

一个备忘录(memento)是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器(originator)。当需要设置原发器的检查点时,取消操作机制会向原发器请求一个备忘录。
原发器用描述当前状态的信息初始化备忘录。只有原发器可以向备忘录中存取信息,备忘录对其他的对象"不可见"。
备忘录模式包含如下角色:
Originator,原发器,可以生成自身状态的快照,也可以在需要时通过快照恢复自身状态。
Memento,备忘录,是原发器状态快照的值对象(value object)。通常做法是将备忘录设为不可变的,并通过构造函数一次性传递数据。
Caretaker,负责人,仅知道“何时”和“为何”捕捉原发器的状态,以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时,
负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复(restoration)方法。
备忘录模式类图表示如下:
备忘录模式(Memento),设计模式,# 行为型,备忘录模式,java

伪代码实现

接下来将使用代码介绍下备忘录模式的实现。

// 1、原发器,支持读写自身状态,支持生成自身状态的快照,支持通过快照恢复自身状态
public class Originator {
    private String name;

    private String describe;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDescribe(String describe) {
        this.describe = describe;
    }

    public String getDescribe() {
        return this.describe;
    }

    public Memento save() {
        return new Memento(this, name, describe);
    }

    public void restore(Memento memento) {
        setName(memento.getName());
        setDescribe(memento.getDescribe());
    }
}

//2、备忘录,是原发器状态快照的值对象
public class Memento {
    private String name;

    private String describe;

    private Originator originator;

    public Memento(Originator originator, String name, String describe) {
        this.originator = originator;
        this.name = name;
        this.describe = describe;
    }

    public String getName() {
        return this.name;
    }

    public String getDescribe() {
        return this.describe;
    }
}

// 3、负责人,通过保存备忘录栈来记录原发器的历史状态。当原发器需要回溯历史状态时,负责人将从栈中获取最顶部的备忘录,并将其传递给原发器的恢复(restoration)方法
public class Caretaker {
    private Originator originator;

    private LinkedList<Memento> history;

    public Caretaker(Originator originator) {
        this.originator = originator;
        history = new LinkedList<>();
    }

    public void snapshot() {
        history.push(originator.save());
    }

    public void undo() {
        Memento lastMemento = history.pop();
        originator.restore(lastMemento);
    }
}

// 4、客户端
public class MementoClient {
    public void test() {
        // (1) 创建原生器实例并设置状态
        Originator originator = new Originator();
        originator.setName("1");
        originator.setDescribe("one");
        // (2) 创建负责人实例
        Caretaker caretaker = new Caretaker(originator);
        // (3) 创建快照
        caretaker.snapshot();
        System.out.println("name is " + originator.getName() + " , " + "describe is " + originator.getDescribe());
        originator.setName("2");
        originator.setDescribe("two");
        caretaker.snapshot();
        System.out.println("name is " + originator.getName() + " , " + "describe is " + originator.getDescribe());
        // (4) 恢复上一个状态
        caretaker.undo();
        System.out.println("name is " + originator.getName() + " , " + "describe is " + originator.getDescribe());
        caretaker.undo();
        System.out.println("name is " + originator.getName() + " , " + "describe is " + originator.getDescribe());
    }
} 

适用场景

在以下情况下可以考虑使用备忘录模式:
(1) 当需要创建对象状态快照来恢复其之前的状态时,可以考虑使用备忘录模式。 备忘录模式允许复制对象中的全部状态(包括私有成员变量),并将其独立于对象进行保存。
尽管大部分人因为 “撤销” 这个用例才记得该模式,但其实它在处理事务(比如需要在出现错误时回滚一个操作)的过程中也必不可少。
(2) 当直接访问对象的成员变量、获取器或设置器将导致封装被突破时,可以考虑使用备忘录模式。备忘录让对象自行负责创建其状态的快照。任何其他对象都不能读取快照,这有效地保障了数据的安全性。

优缺点

备忘录模式有以下优点:
(1) 可以在不破坏对象封装情况的前提下创建对象状态快照。
(2) 可以通过让负责人维护原发器状态历史记录来简化原发器代码。
(3) 给用户提供了一种可恢复状态的机制,能够比较方便地回滚到某个历史状态。
但是该模式也存在以下缺点:
(1) 如果客户端过于频繁地创建备忘录,程序将消耗大量内存。
(2) 负责人必须完整跟踪原发器的生命周期,这样才能销毁弃用的备忘录。

参考

《设计模式 可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著, 李英军, 马晓星等译
https://refactoringguru.cn/design-patterns/memento 备忘录模式
https://www.runoob.com/design-pattern/memento-pattern.html 备忘录模式
https://www.cnblogs.com/adamjwh/p/11018268.html 简说设计模式——备忘录模式文章来源地址https://www.toymoban.com/news/detail-641086.html

到了这里,关于备忘录模式(Memento)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

    目录 1、备忘录模式(Memento Pattern)含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 (1)优点: (2)缺点 5、C++实现备忘录模式的实例 1、备忘录模式(Memento Pattern)含义 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状

    2024年02月10日
    浏览(43)
  • 设计模式(4)--对象行为(6)--备忘录

    1. 意图     在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。     这样以后可以将该对象恢复到原先保存的状态。 2. 三种角色    原发器(Originator)、备忘录(Memento)、负责人(Caretaker) 3. 优点    3.1 保持了封装边界。屏蔽了原发器的内部信息。

    2024年02月04日
    浏览(40)
  • 笨蛋学设计模式行为型模式-备忘录模式【22】

    8.9.1概念 ​ 备忘录模式允许在不暴露对象实现细节的情况下捕获和恢复对象的内部状态。通过将对象的状态封装在备忘录对象中,并将备忘录对象保存在一个管理者对象中,可以在需要时回滚到对象之前的状态。 8.9.2场景 ​ 在现代办公场景中,备忘录模式可以应用于文档编

    2024年01月25日
    浏览(40)
  • Java设计模式之行为型-备忘录模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结  备忘录模式是一种行为型设计模式,它允许保存一个对象的内部状态到一个备忘录对象中,这样就可以在需要的时候恢复这个对象的状态了,同时又不违反封装性原则。 这个模式的核心就是备忘录对象,

    2024年02月16日
    浏览(38)
  • 备忘录模式(Memento)

    备忘录模式是一种行为设计模式,在不破坏封装性的前提下,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 一个备忘录(memento)是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器(originator)。当需要设置原发器的检查点时,取

    2024年02月13日
    浏览(36)
  • 《设计模式》备忘录模式

    定义 : 备忘录模式又称为快照模式或者令牌模式, 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 属性 行为型 模式。 备忘录模式的角色组成 : Originator(发起人) :负责创建一个 Memento

    2024年02月06日
    浏览(45)
  • 设计模式-备忘录模式

    备忘录模式(Memento Pattern)是计算机科学中的一种行为设计模式。它提供了一种在不破坏封装性的前提下,捕获和恢复对象内部状态的方法。这种模式主要用于在用户需要回滚到对象的某个先前状态时,能够实现状态的还原。 在备忘录模式中,主要涉及到三个角色: Origina

    2024年01月23日
    浏览(48)
  • 【设计模式】备忘录模式

    主页传送门: 💁 传送        备忘录(Memento Pattern)模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。。其定义如下: Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.        即:在不破坏封

    2024年02月07日
    浏览(52)
  • 设计模式——备忘录模式

    备忘录模式(Memento Pattern)是一种行为型设计模式,它在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在需要时将对象恢复到先前的状态。 发起人(Originator): 是拥有复杂内部状态的对象,它可以创建和恢复备忘录。 备忘录(M

    2024年01月19日
    浏览(43)
  • 【前端设计模式】之备忘录模式

    设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包