• 【设计模式】Java设计模式 - 备忘录模式


    【设计模式】Java设计模式 - 备忘录模式

    😄 不断学习才是王道
    🔥 继续踏上学习之路,学之分享笔记
    👊 总有一天我也能像各位大佬一样
    🏆 一个有梦有戏的人 @怒放吧德德
    🌝分享学习心得,欢迎指正,大家一起学习成长!

    请添加图片描述

    👊今天继续卷设计模式,备忘录模式理解或者是案例写起来都比较简单

    简介

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

    备忘录模式原理分析

    就是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    备忘录模式比较简单,这就类似于我们以前打游戏的存档,将暂时的数据保存起来,等需要加载存档的时候只需要打开加载就可以恢复到当时保存的时候。
    UML原理图:
    在这里插入图片描述

    角色与职责

    Originator:原对象,需要保存的对象。
    Memento:备忘录对象,负责保存需要保存的内容。
    Caretaker:守护者对象,负责保存多个备忘录对象。

    备忘录实例

    通过以上的uml图编写一个实例,在原始类中声明了状态,通过保存在备忘录,等状态修改后,利用备忘录来回复状态。
    类图:
    在这里插入图片描述

    ①、创建备忘录

    这里就保存state数据,通过构造方法来赋值,在通过get方法获取数据。

    package com.lyd.demo.memento;
    /**
     * @Author: lyd
     * @Description: 备忘录对象
     * @Date: 2022-09-07
     */
    public class Memento {
        private 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
    • 14
    • 15

    ②、创建原始类

    通过saveStateMemento方法实例化备忘录,并把要存储的据带过去赋值,通过getStateFromMemento方法获取数据。

    package com.lyd.demo.originator;
    import com.lyd.demo.memento.Memento;
    /**
     * @Author: lyd
     * @Description: 原始
     * @Date: 2022-09-07
     */
    public class Originator {
        private String state;
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        // 保存对象
        public Memento saveStateMemento() {
            return new Memento(state);
        }
        // 恢复备忘录
        public void getStateFromMemento(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

    ③、创建守护者

    守护者负责收集多个备忘录对象,提供需要恢复哪一个“存档”的数据。定义一个ArrayList链表数组,每次放入备忘录的时候调用add添加到守护者。这里可以不一定是用ArrayList,也可以是直接用HashMap

    package com.lyd.demo.save;
    import com.lyd.demo.memento.Memento;
    import java.util.ArrayList;
    /**
     * @Author: lyd
     * @Description: 守护者,保存多个备忘录对象
     * @Date: 2022-09-07
     */
    public class Caretaker {
        private ArrayList mementoArrayList = new ArrayList();
        public void add(Memento memento) {
            mementoArrayList.add(memento);
        }
        // 获取 - 恢复
        public Memento get(int index) {
            return mementoArrayList.get(index);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    ④、测试

    package com.lyd.demo.test;
    import com.lyd.demo.originator.Originator;
    import com.lyd.demo.save.Caretaker;
    /**
     * @Author: lyd
     * @Description:
     * @Date: 2022-09-07
     */
    public class MementoTest {
        public static void main(String[] args) {
            // 创建原来的状态
            Originator originator = new Originator();
            // 创建备忘录
            Caretaker caretaker = new Caretaker();
            originator.setState("状态A");
            System.out.println("当前状态:" + originator.getState());
            // 存起来
            caretaker.add(originator.saveStateMemento());
            originator.setState("状态B");
            // 存起来
            caretaker.add(originator.saveStateMemento());
            System.out.println("当前状态:" + originator.getState());
            originator.setState("状态C");
            System.out.println("当前状态:" + originator.getState());
            originator.getStateFromMemento(caretaker.get(0));
            System.out.println("恢复首次状态");
            System.out.println("当前状态:" + originator.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
    • 28
    • 29

    运行结果:
    在这里插入图片描述

    好,今天的分享就到这里。

    👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

    💓德德小建议:

    理解设计模式不是一件简单的事情,需要不断的学习和动手去练习,才能理解。只有掌握好设计模式,才能够真正的理解SpringAOP和Mybatis的底层原理。各位读者可以和我一样,动手敲一敲代码,甚至用不同的例子来做,通过debug一步一步调试,还有就是多看看别人的例子。能够有助于理解!谢谢各位观看指点!❤️ ❤️ ❤️

  • 相关阅读:
    针对大型商场的现状,3d全景有哪些解决方案?
    As Const:一个被低估的 TypeScript 特性
    Android NDK开发之震动服务客户端编写程序(C++)
    paddlepaddle(一)文字识别
    Java日期格式
    协同存储,为边缘计算创造更大价值
    Mybaits之多表查询(联合查询、嵌套查询)
    vue2和vue3详细区别
    [E050] Can‘t find model ‘en‘. It doesn‘t seem to be a shortcut link,
    Go gRPC 入门
  • 原文地址:https://blog.csdn.net/qq_43843951/article/details/126754975