• 23种设计模式之备忘录模式(Memento Pattern)


    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的备忘录模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
    如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
    小威在此先感谢各位大佬啦~~🤞🤞
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    以下正文开始
    在这里插入图片描述

    备忘录模式概念

    备忘录模式(Memento Pattern)是一种行为型设计模式。该模式允许在不暴露对象实现细节的情况下,将对象恢复到之前的状态。

    备忘录模式角色

    备忘录模式由三个核心角色组成:

    发起人(Originator):发起人是具有要恢复状态的对象。它定义了创建备忘录对象的方法,以便在需要时使用这些备忘录来恢复对象的先前状态。

    备忘录(Memento):备忘录对象是用于保存发起人对象状态的容器。它通常只存储发起人的状态信息,而不包括任何关于状态如何被捕获或恢复的实现细节。

    管理者(Caretaker):管理者负责管理备忘录对象,并且只能对它们进行保存和恢复的操作。管理者可以对备忘录执行操作,但是不能查看或修改其内容。

    在备忘录模式中,当发起人需要保存旧状态时,它会向管理者请求一个备忘录对象。管理者返回一个新的备忘录对象,并将当前状态保存在其中。如果在之后需要恢复状态时,发起人将这个备忘录对象还原为旧状态,这个备忘录对象将包含旧的状态信息。

    备忘录模式优缺点

    备忘录模式的优点是它可以让发起人对象有更好的封装性,因为它不需要暴露其实现细节;同时,备忘录对象的存储和恢复操作对发起人对象是透明的,从而减少了耦合。然而,使用备忘录模式可能会带来一些开销,尤其是在需要恢复大量状态信息时。

    备忘录模式常见的应用场景包括文本编辑器的撤销操作、数据库事务回滚、游戏存档等等。

    备忘录模式案例

    接着通过一个案例来学习一下备忘录模式:

    首先创建发起人类(Originator)

    public class Originator {
    
        private String state;
    
        public void setState(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
        /**
         * 将当前状态存储到备忘录中
         */
        public Memento createMemento() {
            return new Memento(state);
        }
    
        /**
         * 从备忘录中恢复状态
         */
        public void restoreFromMemento(Memento memento) {
            state = memento.getState();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    接着创建备忘录类(Memento)

    public class Memento {
    
        private final String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    创建负责人类(Caretaker)

    public class Caretaker {
    
        private Memento memento;
    
        /**
         * 存储备忘录
         */
        public void storeMemento(Memento memento) {
            this.memento = memento;
        }
    
        /**
         * 获取备忘录
         */
        public Memento retrieveMemento() {
            return memento;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    然后测试代码

    public class MementoPatternDemo {
    
        public static void main(String[] args) {
            Originator originator = new Originator(); // 创建发起人对象
            Caretaker caretaker = new Caretaker(); // 创建负责人对象
    
            originator.setState("State1"); // 设置状态
            caretaker.storeMemento(originator.createMemento()); // 将备忘录存储到负责人中
    
            originator.setState("State2"); // 改变状态
    
            // 从备忘录恢复当前状态
            originator.restoreFromMemento(caretaker.retrieveMemento());
    
            System.out.println("Current state: " + originator.getState());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果为:

    Current state: State1

    在上述代码中,发起人类(Originator)负责创建和存储备忘录,备忘录类(Memento)用于存储当前状态,负责人类(Caretaker)则负责管理备忘录。在测试代码中,将发起人对象的状态从“State1”改变到“State2”,然后使用负责人对象的备忘录恢复机制将状态还原回原来的“State1”。

    好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
    在这里插入图片描述

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
    希望能和诸佬们一起努力,今后我们顶峰相见🍻
    再次感谢各位小伙伴儿们的支持🤞

    在这里插入图片描述

  • 相关阅读:
    力扣 667. 优美的排列 II
    JVM原理及优化_调优原则与工具
    机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day19
    JAVA小游戏 “拼图”
    C++数据结构:string的基本用法
    迭代器-面试
    jnpf3.6私有化部署
    数据库分页查询
    Python 框架学习 Django篇 (四) 数据库增删改查(CURD)
    高性能高精度Xcode计算22二进制16进制claimBilliard220902
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/130921772