设计模式之备忘录模式讲解

概念:又称为快照模式或Token模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。通俗点说就是备份一个对象,比较典型的场景就是游戏的存档恢复。

  • 发起人角色:也就是被备份的角色,这个角色定义的状态,会被Memento管理起来。
  • 备忘录角色:Memento负责存储发起人的内部状态,在需要时提供给发起人它需要的状态。
  • 责任人角色:该角色对备忘录角色进行管理、保存和提供备忘录。
java 复制代码
public interface Originator {
    void setState(String state);
    String getState();
    Memento createMemento();
    void setMemento(Memento memento);
}

public class ConcreteOriginator implements Originator {
    private String state;
    @Override
    public void setState(String state) {
        this.state = state;
    }
    @Override
    public String getState() {
        return state;
    }
    @Override
    public Memento createMemento() {
        return new ConcreteMemento(state);
    }
    @Override
    public void setMemento(Memento memento) {
        if (memento instanceof ConcreteMemento) {
            this.state = memento.getState();
        }
    }
}

public interface Memento {
    String getState();
}

public class ConcreteMemento implements Memento {
    private String state;
    public ConcreteMemento(String state) {
        this.state = state;
    }
    @Override
    public String getState() {
        return state;
    }
}

public class CareTaker {
    private Memento memento;
    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    public Memento getMemento() {
        return memento;
    }
}

public class Demo {
    public static void main(String[] args) {
        Originator originator = new ConcreteOriginator();
        CareTaker caretaker = new CareTaker();
        originator.setState("初始状态");
        System.out.println("当前状态: " + originator.getState());
        // 保存备忘录
        caretaker.setMemento(originator.createMemento());
        originator.setState("新状态");
        System.out.println("更新后的状态: " + originator.getState());
        // 恢复到备忘录中的状态
        originator.setMemento(caretaker.getMemento());
        System.out.println("恢复后的状态: " + originator.getState());
    }
}

如果大家需要视频版本的讲解,欢迎大家关注我的B站:

【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl

相关推荐
eralong14 小时前
Java 面向对象:继承、多态、接口
java·后端
哦虎!14 小时前
【数据库】事务
java·数据库·mysql
CDN36014 小时前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速
程序员黑豆15 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天1615 小时前
Electron面试题-Day19
java·javascript·electron
GeekZHR16 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
侧耳倾听11116 小时前
java 日志框架简介
java·开发语言
她的男孩16 小时前
我用 LLM 把后台 CRUD 效率提升 10 倍:AI 代码生成器的架构与落地实践
java·后端·架构
土司大王17 小时前
LeetCode hot100——移动零
java·算法·leetcode
thefool11226617 小时前
相同的树`
java