当前位置: 首页 > news >正文

【玩转23种Java设计模式】行为型模式篇:备忘录模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

  • 一、简介
  • 二、实例
    • 1、文本编辑器(TextEditor)
    • 2、管理者(Caretaker)
    • 3、客户端(MementoPatternExample)
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

  备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的状态,以便在未来可以恢复到之前的某个状态。该模式避免了直接暴露对象的内部状态,从而实现了数据的封装性。

主要角色:

  • Originator(发起人):创建并存储自身状态到备忘录中,可以从备忘录中恢复状态。
  • Memento(备忘录):存储发起人的状态,提供给发起人恢复状态的接口。
  • Caretaker(管理者):负责保存和管理备忘录,但不能操作备忘录内容。

二、实例

例如:模拟文本编辑器中“撤销”操作的实现。

1、文本编辑器(TextEditor)

class TextEditor {private String text;public void setText(String text) {this.text = text;}public String getText() {return text;}// 创建备忘录public Memento save() {return new Memento(text);}// 从备忘录恢复状态public void restore(Memento memento) {this.text = memento.getText();}// Memento:备忘录内部类static class Memento {private final String text;private Memento(String text) {this.text = text;}private String getText() {return text;}}
}

2、管理者(Caretaker)

class Caretaker {private final List<TextEditor.Memento> mementoList = new ArrayList<>();public void addMemento(TextEditor.Memento memento) {mementoList.add(memento);}public TextEditor.Memento getMemento(int index) {return mementoList.get(index);}
}

3、客户端(MementoPatternExample)

public class MementoPatternExample {public static void main(String[] args) {TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();// 初始状态editor.setText("Hello");System.out.println("Initial Text: " + editor.getText());caretaker.addMemento(editor.save());// 修改状态1editor.setText("Hello, World");System.out.println("Updated Text: " + editor.getText());caretaker.addMemento(editor.save());// 修改状态2editor.setText("Hello, Design Patterns");System.out.println("Updated Text: " + editor.getText());caretaker.addMemento(editor.save());// 撤销操作editor.restore(caretaker.getMemento(1));System.out.println("After Undo: " + editor.getText());// 再次撤销editor.restore(caretaker.getMemento(0));System.out.println("After Second Undo: " + editor.getText());}
}

三、总结

1、优点

  • 封装性好:发起人和备忘录内部状态的实现细节对外界透明,保证了对象的封装性。
  • 状态恢复:可以轻松保存和恢复对象的状态,适合需要频繁回退操作的场景。
  • 灵活性高:支持保存多个状态,提供多种恢复方式。

2、缺点

  • 资源消耗大:如果状态对象较大或需要保存的状态很多,可能会消耗较多内存。
  • 管理复杂:需要一个管理机制来保存和恢复状态,增加了系统复杂性。

3、应用场景

  • 撤销和重做功能:如文本编辑器、图形编辑器。
  • 游戏存档:在游戏中保存和恢复玩家的进度。
  • 事务性操作:在操作失败时可以回滚到之前的状态。
  • 状态恢复:适用于需要频繁切换对象状态的场景。
http://www.lryc.cn/news/513004.html

相关文章:

  • Unity Shader TexelSize的意义
  • 三、STM32MP257系列之定制Yocto Machine
  • 小程序信息收集(小迪网络安全笔记~
  • 使用 Docker 搭建 Drogon 框架
  • 【Linux报告】实训一:GNME桌面环境的设置及应用
  • 活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识
  • vulnhub靶场【Hogwarts】之bellatrix
  • 移动 APP 设计规范参考
  • HarmonyOS:@Require装饰器:校验构造传参
  • github提交不上去,网络超时问题解决
  • 国产数据库OceanBase从入门到放弃教程
  • 风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
  • Rabbitmq追问2
  • 郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现
  • 如何使用React,透传各类组件能力/属性?
  • 汇编点灯练习
  • 数据结构与算法之动态规划: LeetCode 213. 打家劫舍 II (Ts版)
  • Git工具
  • SpringBoot3.3.3+shardingsphere-jdbc5.5.0读写分离、自定义生成主键策略
  • 开发运维基本功:无需复杂配置快速实现本地Nginx的公网远程访问
  • 金融租赁系统助力企业转型与市场竞争力提升
  • 【漫话机器学习系列】028.CP
  • 软件测试——面试八股文(入门篇)
  • 如何在不同工作场景下优化嵌入式系统的电源消耗
  • java - SpringBoot3.x接入Security6.x实现JWT认证
  • 【每日学点鸿蒙知识】无障碍、getLastLocation、蓝牙问题、卡片大小、关系型数据库等
  • [Linux] 服务器CPU信息
  • MySQL——数据类型
  • 《AI赋能自由职业:开启竞争力提升新征程》
  • Excel转Json编辑器工具