行为型设计模式—备忘录模式

备忘录模式:不破坏封装的前提下, 捕获一个对象的内部状态, 并在对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。即利用快照的思想实现对象的版本更替。

备忘录模式主要适用于以下应用场景。

  1. 需要保存历史快照的场景。
  2. 希望在对象之外保存状态,且除了自己,其他类对象无法访问状态保存的具体内容。

备忘录模式中主要有这三个角色的类

  • Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录,此角色可以类比博客系统中的文章对象

    • 发起者中要有保存方法和从备忘录中恢复状态的方法,保存方法会返回当时状态组成的备忘录对象
  • Memento(备忘录) : 存储着Originator的状态的对象,类比理解即为文章对象的不同版本。

  • Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录 – 类比理解为博客系统中的编辑器对象

    • 管理者的保存和恢复操作,会代理其持有的发起者对象的保存和恢复操作,在这些代理方法中会增加对备忘录对象列表、当前备忘录版本的维护。

某线上博客平台, 需为用户提供在线编辑文章功能,文章主要包括标题 - title 和内容 - content等信息。为最大程度防止异常情况导致编辑内容的丢失, 需要提供版本暂存和Undo, Redo功能。

  • IEditor: 定义编辑器接口

  • EditorMemento: 定义编辑器的备忘录, 也就是编辑器的内部状态数据模型, 同时也对应一个历史版本

  • Editor: 编辑器类, 实现IEditor接口

    把原发器和管理人两个角色集中在Editor类型上一起实现

// 编辑器接口定义
type IEditor interface {Title(title string)Content(content string)Save()Undo() errorRedo() errorShow()
}

备忘录类

type Memento struct {title stringcontent stringcreateTime int64
}func newMemento(title string, content string) *Memento {return &Memento{title, content, time.Now().Unix(),}
}

Editor实现,Undo、Redo方法即回退、前进方法在实现的时候就是依赖的它内部记录的一组Memento对象,通过指向不同的Memento对象来实现回退和前进功能。

// 编辑器类, 实现IEditor接口
type Editor struct {title    stringcontent  stringversions []*Mementoindex    int
}func NewEditor() IEditor {return &Editor{"", "", make([]*Memento, 0), 0,}
}func (editor *Editor) Title(title string) {editor.title = title
}func (editor *Editor) Content(content string) {editor.content = content
}func (editor *Editor) Save() {it := newMemento(editor.title, editor.content)editor.versions = append(editor.versions, it)editor.index = len(editor.versions) - 1
}func (editor *Editor) Undo() error {return editor.load(editor.index - 1)
}func (editor *Editor) load(i int) error {size := len(editor.versions)if size <= 0 {return errors.New("no history versions")}if i < 0 || i >= size {return errors.New("no more history versions")}it := editor.versions[i]editor.title = it.titleeditor.content = it.contenteditor.index = ireturn nil
}func (editor *Editor) Redo() error {return editor.load(editor.index + 1)
}func (editor *Editor) Show() {fmt.Printf("MockEditor.Show, title=%s, content=%s\n", editor.title, editor.content)
}

执行代码

func main() {editor := NewEditor()// test save()editor.Title("唐诗")editor.Content("白日依山尽")editor.Save()editor.Title("唐诗 登鹳雀楼")editor.Content("白日依山尽, 黄河入海流. ")editor.Save()editor.Title("唐诗 登鹳雀楼 王之涣")editor.Content("白日依山尽, 黄河入海流。欲穷千里目, 更上一层楼。")editor.Save()// test show()fmt.Println("-------------Editor 当前内容-----------")editor.Show()fmt.Println("-------------Editor 回退内容-----------")for {e := editor.Undo()if e != nil {break} else {editor.Show()}}fmt.Println("-------------Editor 前进内容-----------")for {e := editor.Redo()if e != nil {break} else {editor.Show()}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…

【大数据面试题】005 谈一谈 Flink Watermark 水印

一步一个脚印&#xff0c;一天一道面试题。 感觉我现在很难把水印描述的很好&#xff0c;但&#xff0c;完成比完美更重要。后续我再补充。各位如果有什么建议或补充也欢迎留言。 在实时处理任务时&#xff0c;由于网络延迟&#xff0c;人工异常&#xff0c;各种问题&#xf…

PyTorch、NCNN、CV::Mat三者张量的shape

目录 一、PyTorch二、NCNN三、CV::Mat 一、PyTorch 在 PyTorch 中&#xff0c;张量&#xff08;Tensor&#xff09;的形状通常按照 (N, C, H, W) 的顺序排列&#xff0c;其中&#xff1a; N 是批量大小&#xff08;batch size&#xff09; C 是通道数&#xff08;channel numb…

【什么是IDE?新手用哪个IDE比较好?——详细讲解】

什么是IDE&#xff1f;新手用哪个IDE比较好&#xff1f; 1. 什么是IDE&#xff1f;2. 新手适用的IDE 1. 什么是IDE&#xff1f; IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;它是集合了程序开发中多种工具的应用软件。IDE…

机器学习 | 深入集成学习的精髓及实战技巧挑战

目录 xgboost算法简介 泰坦尼克号乘客生存预测(实操) lightGBM算法简介 《绝地求生》玩家排名预测(实操) xgboost算法简介 XGBoost全名叫极端梯度提升树&#xff0c;XGBoost是集成学习方法的王牌&#xff0c;在Kaggle数据挖掘比赛中&#xff0c;大部分获胜者用了XGBoost。…

webp是什么格式,怎么转成.jpg

WebP是一种旨在加快图像加载时间的现代图像格式。这种格式由Google开发&#xff0c;支持无损压缩和有损压缩。WebP格式的图像文件通常比同等质量的JPEG或PNG文件小&#xff0c;这使得它们在提高网页加载速度方面特别有用。 要将WebP格式转换成JPEG格式&#xff0c;我们可以使用…

Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类

目录 一、失败方案串口监听工具Controller层MySerialPortEventListenerimpl 二、成功方案串口监听工具Controller层MySerialPortEventListenerimpl前端Api 在之前的文章中&#xff0c;我们讨论了使用单例模式的SerialPortEventListener类。然而&#xff0c;这种模式在某些情况下…

【代码随想录26】332.重新安排行程 51.N皇后 37.解数独

目录 332.重新安排行程题目描述参考代码 51.N皇后题目描述参考代码 37.解数独题目描述参考代码 332.重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机…

09-错误处理

上一篇&#xff1a;08-常用集合(容器) 在软件中&#xff0c;错误是一个不争的事实&#xff0c;因此 Rust 提供了许多功能来处理出错的情况。在许多情况下&#xff0c;Rust 要求您在编译代码之前承认出错的可能性并采取一些措施。这一要求可确保您在将代码部署到生产环境之前发现…

JRebel激活-nginx版本

nginx转发流量&#xff08;代替其他网上说的那个工具&#xff09; proxy_pass http://idea.lanyus.com; 工具激活 填写内容说明&#xff1a; 第一行的激活网址是&#xff1a;http://127.0.0.1:8888/ 正确的GUID。GUID 可以通过专门的网站来生成&#xff08;点击打开&#…

kettle控件-复制记录到结果/ 从结果获取记录的使用

在数据采集过程中&#xff0c;遇到对方数据传送不及时的情况&#xff0c;导致数据漏采集&#xff0c;需要手工反复补采。为了解决这一问题&#xff0c;可以利用kettle的复制记录到结果/从结果获取记录控件。 job的整个流程如下&#xff1a; 设置变量&#xff1a; 创建目录: ge…

STM32输出PWM波控制180°舵机

时间记录&#xff1a;2024/2/8 一、PWM介绍 &#xff08;1&#xff09;脉冲宽度调制 &#xff08;2&#xff09;占空比&#xff1a;高电平时间占整个周期时间的比例 &#xff08;3&#xff09;STM32通过定时器实现PWM时具有两种模式 PWM1模式&#xff1a;向上计数模式下&…

软件测试工程师——缺陷(一篇足以)

目录 定义 缺陷的类型 缺陷的严重程度 缺陷的状态 缺陷的根源 ​缺陷的来源 缺陷的起源 缺陷的生命周期 缺陷的识别 缺陷报告模板 编写缺陷报告的目的 缺陷报告编写的准则 缺陷描述的准则 定义 1. 软件未实现产品说明书中所提及的功能 2. 软件实现了产品说明书中…

Python入门知识点分享——(十九)私有属性和方法

上文我们介绍了面向对象的基础知识&#xff0c;了解了类和对象的联系和语法&#xff0c;这次我们就紧接着来介绍面向对象中的私有特点——私有属性和私有方法。 私有属性&#xff0c;顾名思义是指不能在类的外部被使用或直接访问的属性。私有属性严格意义上来说并不能算做第三…

第63讲个人中心用户信息动态显示实现

个人中心页面实现 &#xff08;补充前面的取消按钮逻辑&#xff09; 个人中心用户信息动态显示实现 index.wxml <view class"user_info"><!-- 用户背景信息开始 --><view class"user_info_bg"><view class"user_info_wrap&q…

echarts图表插件

图表组件 ECharts&#xff0c;全称为Enterprise Charts&#xff0c;是一个使用JavaScript实现的开源可视化库。它主要用于数据可视化领域&#xff0c;能够方便地创建出直观、交互性强的图表。ECharts由百度团队开发&#xff0c;目前是Apache的顶级项目之一。ECharts支持的图表…

JVM调优(Window下)

1、编写代码&#xff0c;像下面代码这样&#xff0c;产生OOM&#xff0c; private static final Integer K 1024;/*** 死循环&#xff0c;验证JVM调优* return*/GetMapping(value "/deadLoop")public void deadLoop(){int size K * K * 8;List<byte[]> lis…

Java后端技术助力,党员学习平台更稳定

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

C++奇淫巧计:如何快速观察内存分配

需求 在不严肃的场景下&#xff0c;你想测试、跟踪自己的代码的内存分配&#xff0c;粗略评估有无错误的、意外的行为&#xff0c;怎么做&#xff1f; 代码 很简单&#xff0c;直接重写 new 操作符。 #include <iostream>static int malloc_count 0;void* operator …

38. C++ 引用的本质

1. C 引用的本质 1.1 引用的底层实现方式 引用被称为变量的别名&#xff0c;它不能脱离被引用对象独立存在&#xff0c;这是在高级语言层面的概念和理解&#xff0c;并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量&#xff0c;甚至编译器可以不为引用分配空…