Java23种设计模式-行为型模式之备忘录模式

备忘录模式(Memento Pattern):用于捕获和存储一个对象的内部状态,以便在以后可以将对象恢复到这个状态。备忘录模式通常用于实现撤销功能或者保存对象的历史状态

主要角色:
发起人(Originator):负责创建一个备忘录对象,用于记录当前的内部状态,并可以使用备忘录对象来恢复内部状态。
备忘录(Memento):用于存储发起人的内部状态,可以包含多个状态属性。
管理者(Caretaker):负责管理备忘录对象,可以保存多个备忘录对象,以便在需要时进行恢复操作。

优点:

1.支持撤销和恢复功能,可以方便地将对象恢复到之前的状态。

2.可以有效地封装对象的内部状态,避免直接暴露给外部。

3.简化了对象的备份和恢复操作,提高了代码的可维护性和可读性。
缺点:

可能会增加系统的复杂性,并且如果保存的状态过多,可能会占用较多的内存

适用范围
撤销/重做功能 :在文本编辑器、图形编辑软件等应用中,用户可能希望撤销或重做他们之前的操作,备忘录模式可以很好地实现这一功能。
事务处理系统中的回滚操作 :在数据库管理系统中,事务的回滚操作可以通过保存操作前的状态(即快照)来实现。如果事务执行失败,可以通过快照恢复到事务执行前的状态。
系统快照 :在需要保存系统或应用程序的当前状态,以便在发生故障时可以恢复到该状态的场景中,可以使用备忘录模式。
游戏存档 :在游戏开发中,可以使用备忘录模式来保存游戏的进度,允许玩家在特定检查点保存游戏状态,并在需要时加载之前保存的状态。
版本控制系统 :如Git,可以使用备忘录模式来保存文件的各个版本,允许开发者在不同版本之间切换。
配置文件管理 :在系统上线过程中,记录线上配置文件的状态,以便在紧急情况下可以回滚到上一个稳定版本。
文档编辑器的恢复功能 :在文档编辑器中,可以利用备忘录模式保存文档的历史状态,从而实现文档的恢复功能。
浏览器的后退功能:浏览器可以使用备忘录模式来保存用户访问过的网页状态,实现页面的后退和前进操作。

示例:备忘录Memento、发起人Originator和管理者Caretaker。通过这些类的协作,我们可以保存和恢复对象的状态。在测试类中,我们创建了一个发起人对象和一个管理者对象,并对其进行状态的保存和恢复操作,最终输出了保存和恢复后的状态

java 复制代码
// 备忘录
public class Memento {
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}
// 发起人
public class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public Memento saveStateToMemento(){
        return new Memento(state);
    }
    public void getStateFromMemento(Memento memento){
        state=memento.getState();
    }
}
// 管理者
public class Caretaker {
    private List<Memento> mementoList=new ArrayList<>();

    public void addMemento(Memento memento){
        mementoList.add(memento);
    }
    public Memento getMemento(int index){
        return mementoList.get(index);
    }
}
// 测试类
public class MemenntoPatterrnTest {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State 1");
        originator.setState("State 2");
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("State 3");
        caretaker.addMemento(originator.saveStateToMemento());

        System.out.println("Current State:" +originator.getState());

        originator.getStateFromMemento(caretaker.getMemento(0));
        System.out.println("First saved State:" + originator.getState());

        originator.getStateFromMemento(caretaker.getMemento(1));
        System.out.println("Second saved State:"+originator.getState());
    }
}
相关推荐
未来可期LJ5 小时前
【C++ 设计模式】单例模式的两种懒汉式和饿汉式
c++·单例模式·设计模式
丶白泽12 小时前
重修设计模式-结构型-组合模式
设计模式·组合模式
yunhuibin13 小时前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
_祝你今天愉快14 小时前
技术成神之路:设计模式(十四)享元模式
java·设计模式
蔚一16 小时前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
丶白泽17 小时前
重修设计模式-概览
java·设计模式
java_heartLake19 小时前
设计模式之建造者模式
java·设计模式·建造者模式
G皮T19 小时前
【设计模式】创建型模式(四):建造者模式
java·设计模式·编程·建造者模式·builder·建造者
战神刘玉栋20 小时前
《程序猿之设计模式实战 · 观察者模式》
python·观察者模式·设计模式
nakyoooooo21 小时前
【设计模式】工厂模式、单例模式、观察者模式、发布订阅模式
观察者模式·单例模式·设计模式