二十三种设计模式第二十篇--备忘录模式

2023-11-17

备忘录模式,备忘录模式属于行为型模式。它允许在不破坏封装的情况下捕获和恢复对象的内部状态。保存一个对象的某个状态,以便在适当的时候恢复对象,该模式通过创建一个备忘录对象来保存原始对象的状态,并将其存储在一个负责管理备忘录的负责人对象中。

备忘录模式的核心组成部分包括:

发起人(Originator):负责创建备忘录对象,并在需要的时候将自身状态保存到备忘录中。

备忘录(Memento):用于存储发起人对象的内部状态。

负责人(Caretaker):负责管理备忘录对象,可以对备忘录进行保存、恢复或删除等操作。

备忘录模式的优点包括:

  1. 封装了状态保存和恢复的细节:备忘录模式将保存和恢复对象状态的逻辑封装在备忘录对象中,发起人对象无需关心其具体实现。
  2. 支持撤销操作:通过存储历史状态的备忘录对象,可以轻松实现对象的撤销操作。
  3. 简化了原发器类:发起人对象只需关注自身的核心功能,而状态保存和恢复的责任交给备忘录和负责人对象。

备忘录模式也有一些限制和适用场景:

  • 消耗内存:如果发起人对象的状态非常大或者频繁保存状态,可能会占用大量的内存空间。

  • 额外开销:备忘录模式会引入额外的对象用于保存和管理状态,可能增加系统的开销。

其应用实例:
1、浏览器回退,前进
2、数据库备份与还原
3、Git版本管理
4、棋牌游戏悔棋
5. 编辑器当前 undo,redo.

使用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。
在这里插入图片描述

/**
 * 发起人(Originator)角色:
 *     记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息
 */
public class Originator {
   private String state;
 
   public void setState(String state){
      this.state = state;
   }
 
   public String getState(){
      return state;
   }

   /**
    * 生成一个备忘录对象
    * @return
    */
   public Memento saveStateToMemento(){
      //TODO:  .....将状态信息包装进去.
      return new Memento(state);
   }

   /**
    * 恢复关态
    * @param Memento
    */
   public void getStateFromMemento(Memento Memento){
      //TODO:....从memento对象取出所有的状态进行恢复.
      state = Memento.getState();
   }
}
/**
 * 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
 */
public class CareTaker {
   //TODO:也可以是一个栈来保存.
   private List<Memento> mementoList = new ArrayList<Memento>();
 
   public void add(Memento state){
      mementoList.add(state);
   }

   /**
    * 获取第几步的状态信息
    * @param index
    * @return
    */
   public Memento get(int index){
      return mementoList.get(index);
   }

   /**
    * 出栈操作
    * @return
    */
   public Memento pop(){
      Memento last=mementoList.get(      mementoList.size()-1 );
      if( last!=null ) {
         mementoList.remove(last);
      }
      return last;
   }
}
/**
 * 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
 */
public class Memento {
   //TODO:要保存的状态信息
   private String state;
 
   public Memento(String state){
      this.state = state;
   }
 
   public String getState(){
      return state;
   }  
}
/**
 * 测试类
 */
public class MementoPatternDemo {
   public static void main(String[] args) {
      //创建发起人(Originator)角色: 生成要保存的备忘的对象
      Originator originator = new Originator();
      //创建管理者(Caretaker):保存的列表
      CareTaker careTaker = new CareTaker();

      //记录状态
      originator.setState("State #1");  //#1的状态没有保存
      originator.setState("State #2");
      //保存状态
      careTaker.add(   originator.saveStateToMemento());  //只保存了#2状态.
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #4");
 
      System.out.println("当前状态: " + originator.getState());  //#4

      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("取保存好的第一个状态:  " + originator.getState());  // #2

      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("取保存好的第二个状态: " + originator.getState());  // #3
   }
}

注意事项:
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二十三种设计模式第二十篇--备忘录模式 的相关文章

  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • 设计模式之享元模式

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 2022/9/6小结

    成长 是一个探索自我的过程 看 了不起的我 这本书 不知道是那句话 那个段落 或者那一章触动到了我 曾经我无法发自内心地去读书 去感受书中的情感 或悲伤 或喜悦 曾经我迫切地想通过书籍获得一项技能 获得一种读书人的气质 很幼稚 我不是在读书
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐