Java备忘录模式

本文介绍了备忘录模式的基本概念及其实现方式,包括白箱备忘录和双接口(黑箱)备忘录的实现过程。通过示例代码详细解释了如何在不同场景下应用该模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载一个备忘录模式的实现方法

一、定义:备忘录(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
备忘录模式是用一个对象来存储另外一个对象的内部状态的快照,实现备忘录模式的关键点是在不破坏封装的
情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在合适的时候,把这个对象还原。
说明:备忘录模式适模式中比较好理解的一个,这里就不举例子,但是备忘录模式是模式中实现比较难,或者说
实现比较巧的,这里主要说说。
二、备忘录模式的实现
1,备忘录模式中的角色
发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态
负责人:负责人保存备忘录对象,但不检查备忘录对象的内容
备忘录:备忘录对象将发起人对象的内部状态存起来,并保正其内容不被发起人对象之外的对象像读取
注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄
接口。也许你说我都提供宽接口得了。对这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计
好,安全性不够好。
2,白箱备忘录的实现:

 

白箱的优点:实现简单
白箱的缺点:上边说了,破坏了封装,安全性有些问题。
说明:这里白箱的实现只保存了一个状态,其实是可以保存多个状态的。
3,双接口的实现,宽窄接口(黑箱)
如何实现宽窄接口呢,内部类也许是个好方法。我们把备忘录类设计"成发起人"的内部类,但这样还有的问题是同一
package中的其它类也能访问到,为了解决这个问题,我们可以把"备忘录"的方法设计成私有的方法,这样就
可以保正封装,又保正发起人能访问到。实现如下:
定义窄接口.

 

ok,实现了对大多数人实现比较窄的接口,对Originator实现了宽接口.
三,最后的一些说明:
1,前边两个例子都是记录了单个状态(单check点),要实现多个状态点很容易,只须要把记录state的字符串换
成一个list,然後添加,取得。如果须要随机须得状态点,也可以用map来存放.这样多个check点就实现了。
2,一般情况下可以扩展负责人的功能,让负责人的功能更强大,从而让客户端的操做更少些。解放客户端。
3,自述历史模式,这个就是把发起人,负责人写在一个类中,平时的应用中这种方法比较常见。

 

<think>我们正在讨论Java中的备忘录设计模式。备忘录模式用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便以后可以将该对象恢复到原先保存的状态。根据引用内容,备忘录模式通常涉及三个角色:1.发起人(Originator):需要保存状态的对象。2.备忘录(Memento):存储发起人内部状态的对象。3.管理者(Caretaker):负责保存备忘录,但不能对备忘录的内容进行操作或检查。下面我们将结合引用中的代码示例,详细说明如何实现备忘录模式。###1.备忘录(Memento)类备忘录类用于存储发起人的内部状态。根据引用[3]和引用[4],备忘录类通常包含一个状态属性,并且该状态只能由发起人进行设置和获取。```java//备忘录类publicclassMemento{privatefinalStringstate;//状态(可以是任意复杂的数据结构,这里用String示例)//构造方法,通常由发起人调用以保存状态publicMemento(Stringstate){this.state=state;}//获取状态,通常由发起人调用以恢复状态publicStringgetState(){returnstate;}}```###2.发起人(Originator)类发起人类是需要保存状态的对象。它提供创建备忘录和从备忘录恢复状态的方法。引用[2]和引用[4]提供了两种实现方式,我们结合两者给出一个示例:```java//发起人类publicclassOriginator{privateStringstate;//需要保存的状态//设置状态publicvoidsetState(Stringstate){this.state=state;}//获取状态publicStringgetState(){returnstate;}//创建备忘录:将当前状态保存到备忘录中publicMementocreateMemento(){returnnewMemento(state);}//从备忘录恢复状态publicvoidrestoreFromMemento(Mementomemento){state=memento.getState();}}```###3.管理者(Caretaker)类管理者类负责保存备忘录,但不能修改备忘录内容。通常它只提供存储和获取备忘录的方法。```java//管理者类publicclassCaretaker{privateMementomemento;//保存备忘录publicvoidsaveMemento(Mementomemento){this.memento=memento;}//获取备忘录publicMementoretrieveMemento(){returnmemento;}}```###使用示例下面是一个使用备忘录模式的简单示例:```javapublicclassMementoPatternDemo{publicstaticvoidmain(String[]args){Originatororiginator=newOriginator();Caretakercaretaker=newCaretaker();//设置状态1originator.setState("State#1");//保存状态1caretaker.saveMemento(originator.createMemento());//改变状态originator.setState("State#2");System.out.println("CurrentState:"+originator.getState());//恢复到状态1originator.restoreFromMemento(caretaker.retrieveMemento());System.out.println("RestoredState:"+originator.getState());}}```输出结果:```CurrentState:State#2RestoredState:State#1```###使用场景备忘录模式适用于以下场景:-需要保存一个对象在某一时刻的状态,以便后续恢复。-不希望直接暴露对象的内部状态细节(封装性)。例如:-撤销操作(Undo)功能。-游戏存档。-事务回滚。###注意事项-备忘录会消耗内存,如果状态数据较大或保存频繁,需要考虑内存管理。-在Java中,可以通过序列化实现备忘录的持久化存储。###扩展引用[5]提供了一个GitHub仓库链接,其中包含了备忘录模式的实现代码,可以作为参考。§§相关问题§§1.备忘录模式如何支持多次撤销(多步撤销)?2.备忘录模式与原型模式有何区别?3.如何实现备忘录的持久化存储(例如保存到文件或数据库)?</think>### Java 备忘录模式实现与用法 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下捕获并外部化对象的内部状态,以便后续恢复该状态[^1]。以下是具体实现与用法: #### 核心角色 1. **发起人(Originator)** 需要保存状态的对象,提供创建备忘录和恢复状态的方法 ```java public class Originator { private String state; // 需保存的状态 // 创建备忘录 public Memento saveToMemento() { return new Memento(this.state); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值