当前位置: 首页 > 后端技术 > Java

设计模式的备忘录模式

时间:2023-04-01 13:19:15 Java

不管我们是在使用word还是记事本,系统都会为我们提供撤销功能,这是几乎每个人都会用到的功能。在我们实际开发中,会不会有一个对于非常复杂的对象,当其中一个属性发生变化时,它也提供了撤销功能,可以快速恢复到更新前的状态。提供这个功能的模式也就是今天的话题——备忘录模式。1.概念理解书上的memo的解释是在不破坏封装的情况下捕获对象的内部状态,并将这个状态保存在对象外部,以便后面可以让对象恢复到原来保存的状态。其实就是在一个对象之外增加一个额外的复制对象。每当我们更改对象的某些属性时,我们都会构建一个副本并将副本存储在队列中。从副本恢复数据。显然,需要三个角色:原始对象、副本对象和存放副本的队列。即书中的三个角色定义:Originator(发起者角色):负责创建备忘录,记录需要保存的状态,具有状态回滚功能;即,原始对象。Memento(备忘录角色):用于存储Originator的内部状态,可以防止Originator以外的对象访问;即复制对象。Caretaker(管理员角色):负责存储、提供和管理Memento,不能操作和访问Memento的内容;即存放副本的队列。为了让概念落地,我们基于备忘录模式的思路实现了视频草稿箱的功能。在这个业务场景中,赞助商实际上是剪辑视频的剪辑师。我们可以在这个编辑器中做什么?编辑视频,从草稿箱导入,保存到草稿箱。这不就是始作俑者的作用吗!我们称之为编辑草稿。备忘录不是修改稿吗?我们称之为最终草案。完成的草稿就做好了,需要存放在一个列表中,供我们快速修复,当然是管理员角色。我们基于三个角色来实现代码。2.案例实现备忘录角色(定稿):是用来存储数据的基础对象。视频的属性主要是标题,封面,视频地址/***memo(finaldraft)*@authortcy*@Date16-09-2022*/publicclassVideoMemento{privateStringtitle;私有字符串videoUrl;私有字符串imgs;publicVideoMemento(Stringtitle,Stringcontent,Stringimgs){this.title=title;this.videoUrl=内容;这个.imgs=imgs;}publicStringgetTitle(){返回标题;}publicStringgetContent(){returnvideoUrl;}publicStringgetImgs(){返回图像;}@OverridepublicStringtoString(){return"ArticleMemento{"+"title='"+title+'\''+",content='"+videoUrl+'\''+",imgs='"+imgs+'\''+'}';}}发起者角色(编辑草稿):在基础对象之上,添加保存和撤销操作。可以看到和我们定义的成品图一样,只是增加了saveToMemento()方法和undoFromMemento()方法,用于保存和撤销。/***发起人(草稿)*@authortcy*@Date16-09-2022*/publicclassEditor{privateStringtitle;私有字符串videoUrl;私有字符串imgs;publicEditor(Stringtitle,StringvideoUrl,Stringimgs){this.title=title;this.videoUrl=videoUrl;这个.imgs=imgs;}publicStringgetTitle(){返回标题;}publicStringgetContent(){returnvideoUrl;}publicStringgetImgs(){返回图像;}publicvoidsetTitle(Stringtitle){this.title=title;}publicvoidsetContent(Stringcontent){this.videoUrl=content;}publicvoidsetImgs(Stringimgs){this.imgs=imgs;}/***保存到备忘录*@return*/publicVideoMementosaveToMemento(){VideoMementoarticleMemento=newVideoMemento(this.title,this.videoUrl,this.imgs);返回文章纪念品;}/***从备忘记录恢复*@paramarticleMemento*/publicvoidundoFromMemento(VideoMementoarticleMemento){this.title=articleMemento.getTitle();this.videoUrl=articleMemento.getContent();this.imgs=articleMemento.getImgs();}@OverridepublicStringtoString(){return"Editor{"+"title='"+title+'\''+",content='"+videoUrl+'\''+",imgs='"+imgs+'\''+'}';}}Administrator角色(草稿箱):包含一个栈,用于存放完成的草稿,利用栈的先进后出特性实现渐进式撤销/***Manager(草稿箱)*@authortcy*@Date16-09-2022*/publicclassCaretaker{privatefinalStackSTACK=newStack();publicVideoMementogetMemento(){VideoMementovideoMemento=STACK.pop();返回视频纪念品;}publicvoidaddMemento(VideoMementovideoMemento){STACK.push(videoMemento);}}读者可以拉取完整代码在本地学习,测试通过后将代码上传至码云。3.总结什么是备忘录模式。你一定已经明白了。如果我们在实际开发中有一个功能复杂、属性多的对象,这时候备忘录模式是一个不错的选择。备忘录模式的实现也很简单。在原对象的基础上增加了一个复制对象,在原对象上增加了两个额外的方法构造一个副本,并从副本中获取值。创建另一个堆栈对象用于存储和管理副本。备忘录模式的优势非常突出。它简化了发起者(原始对象)的责任,隔离了存储状态,实现了信息的封装。客户端无需关心保存细节,提供状态回滚功能。但最明显的缺点是资源消耗。如果对象变化很大,每次save都会消耗很多内存空间,函数会改空间。memo模式在Jdk和Spring中应用并不广泛。在我们的实际应用中,需要衡量空间和效率的影响,是否使用备忘录模式来做出合理的选择。1.设计模式概述2.设计模式的工厂方法和抽象工厂3.设计模式的单例和原型4.设计模式的建造者模式5.设计模式的代理模式6.设计模式的适配器模式7.设计模式的桥梁设计模式模式八、组合模式九、设计模式装饰器模式十、设计模式外观模式十一、外观模式享元模式十二、设计模式责任链模式十三、设计模式命令模式十四、设计解释器模式模式十五、设计模式的迭代器模式模式十六、设计模式的中介模式

最新推荐
猜你喜欢