Java特性之设计模式【备忘录模式】

Java特性之设计模式【备忘录模式】

码农世界 2024-06-06 前端 104 次浏览 0个评论

一、备忘录模式

概述

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

备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态

主要解决:

允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作

何时使用:

  • 需要实现对象状态的撤销和恢复功能。当需要在对象中实现撤销操作或者恢复到先前状态的功能时,备忘录模式是一种有效的设计模式。它可以让对象保存其内部状态的快照,并在需要时进行恢复,从而实现撤销和恢复的功能

    优缺点

    优点:

    • 提供状态恢复机制:允许用户方便地回到历史状态
    • 封装状态信息:用户不需要关心状态的保存细节

      缺点:

      • 资源消耗:如果对象的状态复杂,保存状态可能会占用较多资源

        1. 各个角色介绍

        1.1 备忘录(Memento)

        • 负责存储原发器对象的内部状态。备忘录可以保持原发器的状态的一部分或全部信息

          1.2 原发器(Originator)

          • 创建一个备忘录对象,并且可以使用备忘录对象恢复自身的内部状态。原发器通常会在需要保存状态的时候创建备忘录对象,并在需要恢复状态的时候使用备忘录对象

            1.3 负责人(Caretaker)

            • 负责保存备忘录对象,但是不对备忘录对象进行操作或检查。负责人只能将备忘录传递给其他对象

              2. UML图

              ​ 备忘录模式使用三个类 MementoOriginatorCareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态

              3. 具体例子和代码

              角色分配

              • Memento:备忘录

              • Originator:原发器

              • Caretaker:负责人

                3.1 备忘录实体

                • Memento
                  package com.vinjcent.prototype.memento;
                  import io.swagger.annotations.ApiModelProperty;
                  import lombok.Data;
                  /**
                   * @author vinjcent
                   * @description 备忘录
                   * @since 2024/5/16 20:11
                   */
                  @Data
                  public class Memento {
                      @ApiModelProperty(value = "状态")
                      private String state;
                      public Memento(String state) {
                          this.state = state;
                      }
                  }
                  

                  3.2 原发器实体

                  • Originator
                    package com.vinjcent.prototype.memento;
                    import io.swagger.annotations.ApiModelProperty;
                    import lombok.Data;
                    /**
                     * @author vinjcent
                     * @description 原发器
                     * @since 2024/5/16 20:16
                     */
                    @Data
                    public class Originator {
                        @ApiModelProperty(value = "状态")
                        private String state;
                        public Memento saveStateToMemento() {
                            return new Memento(state);
                        }
                        public void getStateFromMemento(Memento memento) {
                            state = memento.getState();
                        }
                    }
                    

                    3.3 负责人

                    • CareTaker
                      package com.vinjcent.prototype.memento;
                      import io.swagger.annotations.ApiModelProperty;
                      import lombok.Data;
                      import java.util.ArrayList;
                      import java.util.List;
                      /**
                       * @author vinjcent
                       * @description 负责人
                       * @since 2024/5/16 20:23
                       */
                      @Data
                      public class CareTaker {
                          @ApiModelProperty(value = "备忘录列表")
                          private List mementoList = new ArrayList();
                          public void add(Memento state) {
                              mementoList.add(state);
                          }
                          public Memento get(int index) {
                              return mementoList.get(index);
                          }
                      }
                      

                      3.4 测试主函数

                      package com.vinjcent.prototype.memento;
                      /**
                       * @author vinjcent
                       * @description 备忘录模式
                       * @since 2024/5/16 20:24
                       */
                      public class Main {
                          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());
                          }
                      }
                      
                      • 测试结果

                        4. 使用场景

                        • 当需要提供一种撤销机制,允许用户回退到之前的状态时

转载请注明来自码农世界,本文标题:《Java特性之设计模式【备忘录模式】》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,104人围观)参与讨论

还没有评论,来说两句吧...

Top