首页 > 其他分享 >备忘录模式:保存对象状态

备忘录模式:保存对象状态

时间:2023-06-12 18:01:17浏览次数:32  
标签:状态 String 保存 模式 备忘录 state currentIndex public Memento

备忘录模式是一种行为型设计模式,用于保存对象的状态,以便在需要时恢复该状态。它通常用于撤销操作或回滚事务。

示例代码

// 被保存状态的对象
class Originator {
    private String state;

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

    public Memento saveState() {
        return new Memento(state);
    }

    public void restoreState(Memento memento) {
        state = memento.getState();
    }
}

// 保存的状态
class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

// 管理所有保存的状态
class Caretaker {
    private final List<Memento> mementos = new ArrayList<>();
    private int currentIndex = -1;

    public void addMemento(Memento memento) {
        mementos.add(memento);
        currentIndex++;
    }

    public Memento undo() {
        if (currentIndex <= 0) {
            throw new IllegalStateException("Can not undo any further");
        }
        currentIndex--;
        return mementos.get(currentIndex);
    }

    public Memento redo() {
        if (currentIndex >= mementos.size() - 1) {
            throw new IllegalStateException("Can not redo any further");
        }
        currentIndex++;
        return mementos.get(currentIndex);
    }
}

使用备忘录模式,当需要保存当前状态时,Originator调用saveState()方法创建一个Memento对象,并将其传递给Caretaker进行管理。当需要恢复之前的某个状态时,Originator可以从Caretaker中获取相应的Memento对象,并将其传递给restoreState()方法进行恢复。

这个示例展示了一个简单的撤销和重做功能:每次保存状态时,都会将其加入到Caretaker中管理。当用户执行撤销操作时,Caretaker从历史记录中取出上一个状态的Memento对象,然后Originator使用该对象恢复状态;当用户执行重做操作时,则是取出下一个状态的Memento对象,并让Originator恢复其状态。

缺点: 耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存。

标签:状态,String,保存,模式,备忘录,state,currentIndex,public,Memento
From: https://www.cnblogs.com/li053/p/17475659.html

相关文章

  • 职责链模式:推卸责任
    职责链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到其中一个处理者能够处理该请求为止。//抽象处理者publicabstractclassHandler{protectedHandlersuccessor;publicvoidsetSuccessor(Handlersuccessor){this.successor=suc......
  • 一句话设计模式1: 单例模式
    单例模式:全局唯一的对象。文章目录单例模式:全局唯一的对象。前言一、为什么要全局唯一?二、如何实现单例1.注入到spring中2.饿汉式3.懒汉式第一种:静态内部类第二种:synchronized关键字第二种:双重锁检查总结前言单例可以说是设计模式中很常用的模式了,但也可以说是很复......
  • 一句话设计模式4:观察者模式
    观察者模式:牵一发而动全身。文章目录观察者模式:牵一发而动全身。前言一、观察者的作用二、如何实现观察者总结前言观察者模式一般使用场景是:多个对象之间存在联系,当其中一个改变的时候,其他的所有关系对象都要做出相应改变;一、观察者的作用1可以快速通知其他对象做出改变......
  • 一句话设计模式6:享元模式
    享元模式:局部单例模式。文章目录享元模式:局部单例模式。前言一、享元模式的作用二、如何实现享元模式总结前言享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合系统要创建大量相似对象,相同对象等;一、享元模式的作用1享元模式可以解决对象的重复......
  • 一句话设计模式5:责任链模式
    责任链模式:步步为营。文章目录责任链模式:步步为营。前言一、责任链模式的作用二、如何实现责任链1既然是责任链,那么就需要一个链路的承载体ChainBody2责任链中每一步都是一个抽象类,因为承载体仅仅是构造链路顺序,里面不放置任何具体业务逻辑:步骤抽象类3具体步骤执行,继承......
  • 0001.Excel文件新建读取修改保存
    一、文件读取python办公自动化,会用到xlrd库,所以需要先安装xlrd库。importxlrdwb=xlrd.open_workbook('招生表.xls')#读取工作簿ws=wb.sheets()#文件sheets包含项,列表式的键值对print(ws)wsname=wb.sheet_names()#列表式工作簿下的所有工作表对象p......
  • 关于浏览器的PWA模式
    浏览器的PWA模式是一种可安装(Installable),可以出现在设备的主屏幕。关于开发如何识别PWA模式constisInStandaloneMode=()=>(window.matchMedia('(display-mode:standalone)').matches)......
  • Redis集群-哨兵模式搭建(1主2从3哨兵节点)
    Redis集群-哨兵模式搭建(1主2从3哨兵节点)原创 北极星 运维记事 2023-04-2022:47 发表于四川收录于合集#redis8个主机规划类型IP地址端口号主192.168.77.1456379从1192.168.77.1466379从2192.168.77.1476379哨兵1192.168.77.14526379哨兵2......
  • C# base64字符串转为图片保存到本地
    #regionBase64解码图片//<summary>///图片上传Base64解码///</summary>///<paramname="dataURL">Base64数据</param>///<returns>返回一个相对路径</returns>publicJsonResul......
  • MySql5.7主从同步配置(gtid模式)
    mysql数据库主从同步配置是开发中比较常见的需求,在MySql里,主从同步主要有两种,bin-log和gtid。下面就主要总结一下使用gtid模式配置主从同步的过程。1.概念全局事务标识:globaltransactionidentifiers;GTID是一个事务一一对应,并且全局唯一ID;一个GTID在一个服务器上只执行一次,避免......