首页 > 其他分享 >备忘录模式

备忘录模式

时间:2024-02-13 14:22:42浏览次数:28  
标签:document 模式 备忘录 import Document public memento

备忘录模式-Memento Pattern

别名:快照模式-Snapshop Pattern 或令牌模式- Token Pattern

是什么?

是指在不破坏封装的前提下,捕获一个对象的内部状态,并且在对象之外保存这个状态,这样我们就可以在需要的时候将该对象恢复到原先保存的状态了。

可以做什么?

可以提供一种“后悔药”的机制,当你需要让对象返回之前的状态时,例如:你的用户请求“撤销”,就使用备忘录模式。

怎么实现的?

它通过存储系统中各个历史状态的快照,使得我们可以在任意时刻将系统回滚到历史状态。
通过堆栈方式:

应用场景

  • 编辑文档写文章的时候,经常写错,需要撤销的操作(Ctrl+Z),有这种需求的时候可以就用该模式。
  • 保存游戏进度,比如闯关模式,经常会挂掉,需要恢复到一个时间点。
  • SVN、Git 等都提供了历史版本的管理功能
  • 服务器的快照功能也可以让我们回退到历史状态
  • 应用场景总结:
    1.需要保存历史快照的场景
    2.希望在对象之外保存状态,且除了自己其他对象无法访问状态的具体保存内容

优缺点

  • 优点:简化了发起人的职责,将状态的存储和获取进行了隔离,而且客户端无需关心状态的保存细节。
  • 缺点:消耗资源,如果每个快照的内容都非常大,会消耗大量内存。

代码实现示例

文档类-Document
package com.muse.patterns.memento;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @description 文档类
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Document {

    // 文档的内容
    private String content;

    public void print() {
        System.out.println("content=" + content);
    }
}

备忘录-Memento
package com.muse.patterns.memento;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @description 备忘录
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Memento {

    // 文档内容
    public String content;
}

备忘录管理类-MememtoManager
package com.muse.patterns.memento;

import java.util.Stack;

/**
 * @description 备忘录管理类
 */
public class MementoManager {
    // 记录备忘录信息
    private Stack<MementomementoStack = new Stack<>();

    // 保存备忘录
    public void save(Document document) {
        Memento memento = new Memento(document.getContent());
        mementoStack.add(memento);
    }

    // 撤销操作ctrl+z
    public Document cancel() {
        Memento memento = mementoStack.pop();
        Document document = new Document();
        document.setContent(memento.getContent());
        return document;
    }
}

备忘录测试类-MementoTest
package com.muse.patterns.memento;

/**
 * 备忘录测试类
 */
public class MementoTest {
    public static void main(String[] args) {
        MementoManager mementoManager = new MementoManager();
        System.out.println("-----执行文档修改操作-----");
        Document document = new Document();
        document.setContent("a");
        document.print();
        mementoManager.save(document);

        document.setContent("b");
        document.print();
        mementoManager.save(document);

        document.setContent("c"); // 修改后,发现写错了,想要回撤到上一个保存点
        document.print();

        System.out.println("-----执行第一次撤销操作-----");
        document = mementoManager.cancel();
        document.print();

        System.out.println("-----执行第二次撤销操作-----");
        document = mementoManager.cancel();
        document.print();
    }
}

标签:document,模式,备忘录,import,Document,public,memento
From: https://www.cnblogs.com/look06888/p/18012799

相关文章

  • extism cli 模式简单试用
    安装clicurlhttps://get.extism.org/cli|shcli模式运行官方提供了一个示例项目,可以快速体验命令PLUGIN_URL="https://github.com/extism/plugins/releases/latest/download/count_vowels.wasm"extismcall$PLUGIN_URLcount_vowels--i......
  • 设计模式--行为型模式
    设计模式--行为型模式目录设计模式--行为型模式模板方法模式定义结构举个栗子策略模式定义结构举个栗子命令模式定义结构举个栗子责任链模式定义结构举个例子状态模式定义结构举个栗子使用场景观察者模式定义结构举个栗子中介模式定义结构举个栗子迭代器模式定义结构举个栗子访问......
  • 设计模式--结构型模式
    设计模式--结构型模式目录设计模式--结构型模式代理模式静态代理jdk动态代理(接口实现原理)Cblib动态代理(继承原理)适配器模式类适配器模式对象适配器模式接口适配器模式装饰者模式使用场景:静态代理与装饰者模式的区别:桥接模式使用场景外观模式组合模式享元模式代理模式结构:......
  • 单例模式
    介绍实现步骤饿汉单例模式(急汉子,娃娃亲,类一加载,对象就创建了)为什么叫饿汉式?类被加载时,对象就被创建了。(太饿了,所以先创建?)常常创建的对象是重量级的对象,如果不用会造成资源浪费。步骤代码举例懒汉单例模式(调用静态方法才创建,考前突击,屎到肛门不得不拉)为什么叫懒......
  • 设计模式--桥接模式(Bridge Pattern)
    桥接模式(BridgePattern)是一种结构型设计模式,它主要是用于将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式主要包含以下几个角色:Abstraction(抽象类):定义抽象类的接口,它维护对Implementor的引用。RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口。Implement......
  • 设计模式
    设计模式创建一个接口;publicinterfaceShape{voiddraw();}创建实现接口的实体类;publicclassRectangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("InsideRectangle::draw()method.");}}创建一个工厂......
  • Kubernetes常用命令备忘录
    本文主要整理了Kubernetes常用命令,给朋友们一个备忘录。查看K8S的帮助命令kubectl--help切换被操作的集群默认情况下会在.kube目录下的config文件里的证书去操作K8S集群。如果碰到需要切换访问别的K8S集群的场景,可以使用kubectl--kubeconfigxxxxxx去指定某个证书文件,比如......
  • OOM内存泄露速查备忘录
    本文整理了一份OOM内存泄露问题速查备忘录,详细见下文。1、核心步骤top、free、df三连,查看CPU、内存、磁盘的大致情况。netstat-lp查看端口占用情况。导出内存dump文件:#保存了堆内存现场jmap-dump:format=b,file=heap.dumppid#强制保存了堆内存现场jmap-F-dump:......
  • Docker小知识备忘录
    本文整理了一些Docker基础知识和常用命令,方便朋友们查阅。同时也感谢Docker这个划时代的产品,它解决了环境一致性的问题,让交付和迁移更轻松。1、Docker与虚拟化1.1、虚拟化技术虚拟化技术分为两大类,全虚拟化和半虚拟化。全虚拟化比如之前我们使用的虚拟机就是全虚拟化,这种......
  • Mac电脑安装RedisCluster集群(非Docker模式)
    第1步,新建redis.confredis.conf内容如下:port7021cluster-enabledyes              //启用集群模式cluster-config-filenodes.conf     //集群的配置文件cluster-node-timeout5000appendonlyyesdaemonizeyesbind0.0.0.0   ......