【学习笔记】设计模式-备忘录模式(Memento)

本文详细介绍了备忘录模式的概念、作用及其实现思路。通过创建Memento、Originator和CareTaker三个类,实现对象状态的备份与恢复。在测试类中展示了如何使用该模式,通过CareTaker管理多个备忘录,以便在需要时恢复Originator的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 设计模式

不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式

https://blog.csdn.net/qq_42874315/article/details/120006447

1 备忘录模式

备忘录模式主要的作用是保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

类似于:后悔药、打游戏时的存档、Windows 里的 ctri + z、浏览器中的后退、数据库的事务管理。

2 实现思路

在这里插入图片描述

备忘录模式使用三个类 Memento、Originator 和 CareTaker。

Memento 包含了要被恢复的对象的状态。

Originator 创建并在 Memento 对象中存储状态。

Caretaker 对象负责从 Memento 中恢复对象的状态。

3 需要的类

  1. 备忘录

    不面向用户,用户面向管理者去调用。

    需要备份的属性,属性与目标对象一致。

    通过有参构造对其赋值

    用get方法,获取到这些属性。

  2. 要备份的目标对象

    自身的属性

    set/get方法

    将当前状态存储到备忘录的方法,返回值为备忘录类型

    从备忘录中获取属性的方法,当前自身对象进行赋值(入参为备忘录)

  3. 备忘录管理者(链式备忘录)

    一个List用来存储多个备忘录

    add方法,给list中添加备忘录

    get方法,通过index获取备忘录

  4. 测试类

    给目标对象赋值

    通过目标对象中的保存到备忘录的方法,获取到一个Memento对象

    将这个memento对象添加到备忘录管理者中(通过管理者的添加方法)

4 具体实现

4.1 Memento(备忘录)

/**
 * Memento 包含了要被恢复的对象的状态。
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/27 17:53
 */
public class Memento {

    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState(){
        return state;
    }
}

4.2 Originator(目标对象)

/**
 * Originator 创建并在 Memento 对象中存储状态。
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/27 17:54
 */
public class Originator {

    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState(){
        return state;
    }

    public Memento saveStateToMemento(){
        return new Memento(state);
    }

    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}

4.3 CareTaker(管理者)

/**
 * Caretaker 对象负责从 Memento 中恢复对象的状态。
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/27 17:57
 */
public class CareTaker {

    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento mementoState){
        mementoList.add(mementoState);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}

4.4 测试类

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/27 17:59
 */
public class Test {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("State #1");
        originator.setState("State #2");

        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #3");

        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #4");

        System.out.println("Current State: " + originator.getState());

        originator.getStateFromMemento(careTaker.get(0));

        System.out.println("First saved State: " + originator.getState());

        originator.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}

5 思维导图

在这里插入图片描述

6 示例源码地址

https://github.com/ChenJiahao0205/design-pattern/tree/master

最后

我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同

想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看

在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五条Programmer

比心~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值