嗨,伙计!刷到这篇文章就是有缘人,在阅读这篇文章前我有一些建议:
备忘录模式,又称之为快照模式(Snapshop Pattern),是一种行为型设计模式,,它允许在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们提供一种“后悔药”的机制,它通过存储系统中各个历史状态的快照,使得我们可以在任一时刻将系统回滚到历史状态。
备忘录模式的主要角色包括:
经常使用在线笔记类软件进行文本内容编辑的小伙伴肯定有这样的印象:在编写一段文本的时候,使用笔记软件可以手动或者自动地保存文本内容,这里的每一次执行自动或手动的保存就可以理解为当前文本的一次快照,在文本编写的过程中,如果有需要,可以回退到任意历史版本。
1、TextContent.java:文本内容实体类,即备忘录发起人角色,除了本身的业务内容外,还具有创建和回退的功能;
- /**
- * 文本内容
- */
- @Data
- @AllArgsConstructor
- public class TextContent {
- private String title;
- private String content;
- private Date createTime;
-
- /**
- * 创建备忘录
- * @return
- */
- public TextContentMemento create(){
- TextContentMemento textContentMemento = new TextContentMemento(this.title, this.content, this.createTime);
- return textContentMemento;
- }
-
- /**
- * 回退指定备忘录内容
- * @param textContentMemento
- */
- public void rollback(TextContentMemento textContentMemento){
- this.title=textContentMemento.getTitle();
- this.content=textContentMemento.getContent();
- this.createTime=textContentMemento.getCreateTime();
- }
-
- /**
- * 对象信息展示
- */
- public void show(){
- System.out.println("标题:"+this.title);
- System.out.println("内容:"+this.content);
- }
- }
2、TextContentMemento.java:文本内容备忘录实体类,即具体的备忘录角色,与文本内容实体类有相的属性;
- /**
- * 文本内容备忘录
- */
- @Data
- @AllArgsConstructor
- public class TextContentMemento {
- private String title;
- private String content;
- private Date createTime;
- }
3、TextContentCaretaker.java:文本内容备忘录的管理类,即备忘录管理者角色,可以获取指定备忘录内容、添加备忘录内容、查看备忘的版本数量;
- /**
- * 文本内容备忘录的管理者][
- */
- public class TextCaretaker {
- private List
list=new ArrayList<>(); -
- /**
- * 备忘录中版本数量
- * @return
- */
- public Integer size(){
- return this.list.size();
- }
-
- /**
- * 获取指定版本备忘录
- * @param index
- * @return
- */
- public TextContentMemento get(Integer index){
- return this.list.get(index);
- }
-
- /**
- * 添加指定备忘录内容
- * @param textContentMemento
- */
- public void add(TextContentMemento textContentMemento){
- this.list.add(textContentMemento);
- }
- }
4、编写客户端,模拟多个版本文本内容编辑并回退到指定版本;
- public class Client {
- public static void main(String[] args) {
- TextContent textContent = new TextContent("设计模式之备记录模式v1", "this is v1", new Date());
- System.out.println("v1:");
- textContent.show();
- TextCaretaker textCaretaker = new TextCaretaker();
- //创建并添加第一个快照
- TextContentMemento textContentMemento = textContent.create();
- textCaretaker.add(textContentMemento);
- textContent.setTitle("设计模式之备记录模式v2");
- textContent.setContent("this is v2");
- textContent.setCreateTime(new Date());
- System.out.println("v2:");
- textContent.show();
- //创建并添加第二个快照
- textContentMemento=textContent.create();
- textCaretaker.add(textContentMemento);
- //回退第一个快照的内容
- textContentMemento=textCaretaker.get(0);
- textContent.rollback(textContentMemento);
- System.out.println("回退v1:");
- textContent.show();
- }
- }
备忘录模式适用于以下业务场景:
总之,备忘录模式的特点很明显,也很简单,适用于需要保存和恢复对象状态的场景,如撤销操作、游戏存档、事务回滚等类似场景。
备忘录模式的本质是在不破坏封装性的前提下,捕获和存储一个对象的内部状态,并在需要时将对象恢复到先前的状态。它可以将对象的状态封装在备忘录对象中,使得对象的状态对外部对象是不可见的。同时,通过引入备忘录类作为中介,发起人对象可以将其状态保存到备忘录对象中,而不需要将其私有状态暴露给其他对象。通过使用备忘录模式,我们可以提高软件的灵活性和可维护性,使得软件更加健壮和易于使用。