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

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

相关推荐
小毅&Nora14 小时前
【后端】【C++】从裸指针到 C++20 协程:现代 C++ 内存与并发编程的双重革命
java·c++20
张np14 小时前
java基础-ArrayList
java·开发语言
Swizard14 小时前
别让 AI 假装在工作:Android "Vibe Coding" 的生存指南
android·java·vibe coding
BBB努力学习程序设计14 小时前
Java集合框架:管理数据的"超级工具箱"
java
库库林_沙琪马14 小时前
1、Hi~ SpringBoot
java·spring boot·后端
不会编程的小寒14 小时前
C / C++ 面试题
java·开发语言
BBB努力学习程序设计14 小时前
Java输入输出:让程序能与世界“对话”
java
电饭叔14 小时前
《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之一(Luhn算法解释)
android·java·python
阿宁又菜又爱玩14 小时前
Web后端开发入门
java·spring boot·后端·web
Z3r4y14 小时前
【代码审计】JeecgBoot-3.5.0 四处安全问题分析
java·web安全·代码审计·jeecg-boot