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

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

相关推荐
所待.3832 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood6 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-10 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟30 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生36 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
闲人一枚(学习中)43 分钟前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea