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

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

相关推荐
Via_Neo2 小时前
JAVA中以2为底的对数表示方式
java·开发语言
野生技术架构师3 小时前
一线大厂Java面试八股文全栈通关手册(含源码级详解)
java·开发语言·面试
廋到被风吹走3 小时前
【AI】Codex 多语言实测:Python/Java/JS/SQL 效果横评
java·人工智能·python
tERS ERTS3 小时前
MySQL中查看表结构
java
坊钰3 小时前
Java 死锁问题及其解决方案
java·开发语言·数据库
于先生吖3 小时前
SpringBoot+MQTT 无人健身房智能管控系统源码实战
java·spring boot·后端
仍然.4 小时前
算法题目---模拟
java·javascript·算法
wefly20174 小时前
纯前端架构深度解析:jsontop.cn,JSON 格式化与全栈开发效率平台
java·前端·python·架构·正则表达式·json·php
nbwenren5 小时前
node.js内置模块之---crypto 模块
java
weyyhdke5 小时前
springboot和springframework版本依赖关系
java·spring boot·后端