您的位置:首页 > 健康 > 养生 > 网站seo诊断报告怎么写_室内设计效果图用什么软件做的_免费网页在线客服系统代码_在线培训系统

网站seo诊断报告怎么写_室内设计效果图用什么软件做的_免费网页在线客服系统代码_在线培训系统

2024/10/5 18:28:37 来源:https://blog.csdn.net/qq_44732500/article/details/142437426  浏览:    关键词:网站seo诊断报告怎么写_室内设计效果图用什么软件做的_免费网页在线客服系统代码_在线培训系统
网站seo诊断报告怎么写_室内设计效果图用什么软件做的_免费网页在线客服系统代码_在线培训系统

备忘录模式

🎯 备忘录模式(Memento Pattern)简介

备忘录模式 是一种行为型设计模式,用于保存对象的某一时刻状态,以便稍后可以恢复到该状态,而不破坏对象的封装性。备忘录模式将对象的状态封装在一个独立的备忘录对象中,外界无法直接访问备忘录的内部细节,只能通过特定接口恢复对象的状态。

核心思想

通过在不破坏封装性的前提下,记录和恢复对象的内部状态,备忘录模式可以让对象恢复到以前的某个状态,常用于撤销操作等场景。

备忘录模式的 UML 类图

在这里插入图片描述

角色说明

  1. Originator(发起者)
    • 发起者是拥有某个内部状态的对象,它能够创建备忘录来记录当前状态,并通过恢复备忘录对象来恢复之前的状态。
  2. Memento(备忘录)
    • 备忘录存储了发起者的内部状态。在外部对象中,备忘录是不可变的,只有发起者可以访问并使用其内容。
  3. Caretaker(负责人)
    • 负责人负责保存和管理备忘录对象,但不能修改或访问备忘录的内容。它只知道如何保存和恢复备忘录。

生动案例:文本编辑器中的撤销功能

场景说明

假设我们有一个简单的文本编辑器,它允许用户输入文本并提供撤销功能。每次用户输入新的文本时,编辑器会保存当前状态(文本内容)到备忘录中。当用户点击“撤销”时,编辑器将恢复到上一个保存的状态。

代码实现

Step 1: 定义发起者类

Originator 类代表文本编辑器,它能够创建和恢复备忘录对象。

// 发起者:文本编辑器
public class TextEditor {private String text;// 设置文本public void setText(String text) {this.text = text;System.out.println("TextEditor: Setting text to '" + text + "'");}// 获取当前文本状态public String getText() {return text;}// 创建备忘录,保存当前文本状态public Memento save() {return new Memento(text);}// 从备忘录恢复文本状态public void restore(Memento memento) {this.text = memento.getText();System.out.println("TextEditor: Restored text to '" + text + "'");}// 备忘录类,用于存储文本状态public static class Memento {private final String text;public Memento(String text) {this.text = text;}private String getText() {return text;}}
}

Step 2: 定义负责人类

Caretaker 类负责保存和管理文本编辑器的多个备忘录,以便用户可以执行多次撤销操作。

import java.util.Stack;// 负责人:管理备忘录的保存和恢复
public class Caretaker {private Stack<TextEditor.Memento> mementoStack = new Stack<>();// 保存备忘录public void save(TextEditor editor) {System.out.println("Caretaker: Saving state.");mementoStack.push(editor.save());}// 恢复备忘录public void undo(TextEditor editor) {if (!mementoStack.isEmpty()) {System.out.println("Caretaker: Undoing last operation.");editor.restore(mementoStack.pop());} else {System.out.println("Caretaker: No states to undo.");}}
}

Step 3: 测试备忘录模式

public class MementoPatternDemo {public static void main(String[] args) {TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();// 设置文本状态并保存editor.setText("Version 1");caretaker.save(editor);editor.setText("Version 2");caretaker.save(editor);editor.setText("Version 3");// 执行撤销操作caretaker.undo(editor);  // 撤销到 Version 2caretaker.undo(editor);  // 撤销到 Version 1caretaker.undo(editor);  // 无法继续撤销}
}

输出结果

TextEditor: Setting text to 'Version 1'
Caretaker: Saving state.
TextEditor: Setting text to 'Version 2'
Caretaker: Saving state.
TextEditor: Setting text to 'Version 3'
Caretaker: Undoing last operation.
TextEditor: Restored text to 'Version 2'
Caretaker: Undoing last operation.
TextEditor: Restored text to 'Version 1'
Caretaker: No states to undo.

备忘录模式的优缺点

优点

  1. 保持封装性
    备忘录模式不会暴露对象的内部状态,保证了对象的封装性。
  2. 方便状态恢复
    可以轻松地将对象恢复到先前的状态,实现如撤销、回滚等功能。
  3. 简化复杂对象状态的管理
    通过备忘录模式,可以方便地保存和恢复对象的多个状态,适合需要频繁更改状态的场景。

缺点

  1. 占用资源
    如果保存的状态较多或状态信息较大,备忘录模式会占用大量内存,导致性能问题。
  2. 实现较复杂
    实现备忘录模式需要额外的类和逻辑来保存和管理状态,增加了代码复杂性。

备忘录模式的应用场景

  1. 撤销操作
    在编辑器、文档处理器等软件中,当用户进行编辑时,备忘录模式可以保存每一步操作的状态,从而支持撤销功能。
  2. 事务管理
    在数据库事务中,备忘录模式可以用来记录事务的中间状态,以便在发生错误时回滚到之前的状态。
  3. 游戏进度保存
    在游戏开发中,备忘录模式可以用于保存游戏的当前进度,以便玩家可以恢复到之前的游戏状态。

备忘录模式思想在优秀源码中的应用

Java 的 Serializable 接口(对象状态的持久化)

在 JDK 中,Serializable 接口允许对象的状态以字节流的形式保存和恢复。这与备忘录模式类似,因为它能够在某个时刻保存对象的完整状态,并在需要时恢复该状态

Serializable 示例

import java.io.*;class Originator implements Serializable {private String state;public Originator(String state) {this.state = state;}public String getState() {return state;}public void setState(String state) {this.state = state;}@Overridepublic String toString() {return "State: " + state;}
}public class SerializableMementoExample {public static void main(String[] args) {Originator originator = new Originator("Initial State");// 保存状态到文件try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("memento.ser"))) {out.writeObject(originator);} catch (IOException e) {e.printStackTrace();}// 修改状态originator.setState("Modified State");System.out.println("Current State: " + originator);// 从文件恢复状态try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("memento.ser"))) {Originator restored = (Originator) in.readObject();System.out.println("Restored State: " + restored);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
解释
  • Serializable 通过序列化和反序列化机制将对象的状态保存到文件中(类似于备忘录模式中的 Memento),并在需要时恢复对象状态。
  • 尽管 Serializable 的应用范围广泛,并非完全符合备忘录模式的设计意图,但它确实提供了对象状态存储和恢复的能力。

Spring 中的 Transaction Management(事务管理回滚)

Spring Framework 中的事务管理系统也使用了备忘录模式的思想。它通过保存数据库的事务状态,在出现异常或错误时能够将数据恢复到原始状态。

原理

  • 在事务开始时,Spring 会保存当前数据库的状态,类似于创建一个备忘录(Memento)。
  • 如果事务中发生错误,Spring 可以将数据库回滚到之前的状态,类似于从备忘录中恢复状态。
  • 这一机制通过 Spring 的事务管理器 实现,允许将整个事务的状态保存并在需要时恢复。
@Transactional
public void transferMoney(Account fromAccount, Account toAccount, double amount) {fromAccount.withdraw(amount);toAccount.deposit(amount);// 在这里如果发生异常,Spring 会自动回滚事务到之前的状态
}

解释

  • @Transactional 方法抛出未检查异常时,Spring 的事务管理机制会回滚之前的操作,恢复数据库到初始状态。这个操作类似于备忘录模式中的“撤销”,在事务失败时恢复到之前的状态。

总结

备忘录模式 提供了一种记录对象状态的机制,并在不破坏对象封装的前提下恢复对象状态。通过备忘录模式,系统可以轻松实现撤销、重做、恢复等功能,非常适合需要频繁修改和恢复对象状态的场景。

通过文本编辑器撤销功能的案例,我们清晰地展示了备忘录模式如何应用于实际开发中,使系统可以灵活管理对象的历史状态,实现多步撤销操作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com