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

概念:又称为快照模式或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

相关推荐
wuyikeer2 分钟前
Spring BOOT 启动参数
java·spring boot·后端
多看书少吃饭10 分钟前
Vue + Java + Python 打造企业级 AI 知识库与任务分发系统(RAG架构全解析)
java·vue.js·笔记
博傅40 分钟前
Kubernetes (K8s) 入门到实战教程
java
奋斗的老史42 分钟前
Stream-流式操作
java·windows
清风徐来QCQ1 小时前
八股文(1)
java·开发语言
zdl6861 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
摇滚侠1 小时前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
架构师沉默2 小时前
AI 让程序员更轻松了吗?
java·后端·架构
加个鸡腿儿2 小时前
从"包裹器"到"确认按钮"——一个组件的三次重构
前端·vue.js·设计模式
MrSYJ2 小时前
有没有人懂socketChannel中的write,read方法啊,给我讲讲
java·程序员·netty