• 设计模式:备忘录模式



    备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。备忘录模式可以将对象的状态保存到备忘录对象中,并在需要时从备忘录对象中恢复状态,实现对象状态的保存和回滚。

    组件

    备忘录模式中,通常包含以下角色:

    1. 发起人(Originator):负责创建备忘录对象,并将自身的状态保存到备忘录对象中。
    2. 备忘录(Memento):用于存储发起人对象的状态。备忘录可以记录发起人的状态,也可以根据需要进行状态的恢复。
    3. 管理者(Caretaker):负责保存备忘录对象,并提供对备忘录的访问。管理者可以保存多个备忘录对象,实现多个时间点的状态回滚。

    代码示例

    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 restoreStateFromMemento(Memento memento) {
            state = memento.getState();
        }
    }
     // 备忘录类
    class Memento {
        private String state;
         public Memento(String state) {
            this.state = state;
        }
         public String getState() {
            return state;
        }
    }
     // 管理者类
    class Caretaker {
        private Memento memento;
         public void saveMemento(Memento memento) {
            this.memento = memento;
        }
         public Memento retrieveMemento() {
            return memento;
        }
    }
     // 客户端代码
    public class Main {
        public static void main(String[] args) {
            Originator originator = new Originator();
            Caretaker caretaker = new Caretaker();
             originator.setState("State 1");
            System.out.println("当前状态:" + originator.getState());
             // 保存状态
            caretaker.saveMemento(originator.saveStateToMemento());
             originator.setState("State 2");
            System.out.println("当前状态:" + originator.getState());
             // 恢复状态
            originator.restoreStateFromMemento(caretaker.retrieveMemento());
            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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    在上述示例中,我们定义了发起人类(Originator)、备忘录类(Memento)和管理者类(Caretaker)。发起人类负责创建备忘录对象并保存状态,备忘录类用于存储状态,管理者类负责保存和提供对备忘录对象的访问。
    客户端代码中,我们创建了发起人对象和管理者对象。发起人对象设置了初始状态,并通过保存状态到备忘录对象中来保存状态。然后,我们修改发起人对象的状态,并通过从备忘录对象中恢复状态来回滚到之前的状态。
    这个示例展示了如何使用Java实现备忘录模式,通过备忘录对象保存和恢复发起人对象的状态,实现对象状态的保存和回滚

    源码中使用

    备忘录模式在源码中有很多应用。以下是一些常见的源码中使用备忘录模式的情况:

    1. Java中的java.util.Date类:Date类提供了 getTime() 和 setTime() 方法来获取和设置日期的时间戳,可以用于保存和恢复日期对象的状态。
    2. Android开发中的Activity生命周期:在Android中,Activity的生命周期方法(如 onCreate() 、 onPause() 等)被用作保存和恢复Activity的状态,以便在系统需要时重新创建和恢复Activity。
    3. 数据库事务管理:在数据库中,事务管理器使用备忘录模式来保存数据库的状态,并在需要时回滚事务,以确保数据的一致性和完整性。
    4. 文本编辑器中的撤销/重做功能:文本编辑器中的撤销/重做功能使用备忘录模式来保存编辑操作的历史状态,以便用户可以撤销和重做操作。
      这些是备忘录模式在源码中的一些常见应用。备忘录模式通过备忘录对象来保存和恢复对象的状态,提供了一种可靠的方式来管理状态,并支持撤销和重做等操作。

    优缺点

    优点:

    1. 备忘录模式可以实现对象状态的备份和恢复,使得系统可以方便地回滚到之前的状态。
    2. 备忘录模式将状态保存在备忘录对象中,与原对象解耦,避免了状态暴露给其他对象,保护了对象的封装性。
    3. 备忘录模式可以灵活地扩展和修改备忘录对象,以满足不同的需求。
      缺点:
    4. 备忘录模式可能会消耗大量的内存,特别是在需要保存大量状态的情况下。
    5. 如果频繁备份和恢复对象状态,会对系统的性能产生一定的影响。
    6. 当对象的状态较多时,管理备忘录对象的成本可能会增加。

    总结

    备忘录模式通过备份和恢复对象状态,提供了一种可靠的方式来管理对象状态。它可以保护对象的封装性,并提供灵活的状态恢复机制。然而,备忘录模式可能会消耗较多的内存,并对系统性能产生一定的影响。在使用备忘录模式时,需要权衡其优缺点,并根据具体情况进行选择。

  • 相关阅读:
    拉格朗日插值法+python实现
    写一个flutter程序—记录
    c++day3
    【java】【MyBatisPlus】【一】快速入门程序
    css_css3新特性
    每日一学—JavaScript数字
    信息安全实验——口令破解技术
    buuctf crypto 【密码学的心声】解题记录
    EdgeX(10) :Xubuntu-22 linux系统安装EdgeX2.1相关服务,服务都比较小,下载启动速度快。
    数据呈现【PPT】
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945827