首页 > 其他分享 >软件设计模式系列之二十——备忘录模式

软件设计模式系列之二十——备忘录模式

时间:2023-09-30 18:55:59浏览次数:39  
标签:状态 历史记录 软件设计 恢复 模式 备忘录 对象

备忘录模式是一种行为型设计模式,它允许我们在不暴露对象内部细节的情况下捕获和恢复对象的内部状态。这个模式非常有用,因为它可以帮助我们实现撤销、恢复和历史记录等功能。在本文中,我们将深入探讨备忘录模式的各个方面,包括定义、示例、结构、实现步骤、代码实现、典型应用场景、优缺点、类似模式以及小结。

1 模式的定义

备忘录模式是一种行为型设计模式,它允许我们在不破坏封装性的前提下,捕获一个对象的内部状态,并在稍后将其恢复到先前的状态。备忘录模式的核心思想是将对象的状态保存在一个备忘录对象中,然后在需要时将状态从备忘录中还原回去。

备忘录模式的主要优势在于它可以帮助我们实现撤销和恢复功能,同时保持对象的封装性。此外,备忘录模式还可以用于实现历史记录和快照功能。

2 举例说明

备忘录通常用于捕获对象的内部状态,并在之后能够将对象恢复到先前的状态。以下是几个日常生活中常见且符合备忘录模式的例子:

文本编辑器的撤销功能。文本编辑器通常具有撤销(Undo)和重做(Redo)功能,它们可以帮助用户恢复到之前的编辑状态。这些功能使用备忘录模式来保存文本编辑器的历史状态,并允许用户在多个历史状态之间切换。

游戏存档。在电子游戏中,玩家可以在游戏进程中保存多个存档点,以便在之后恢复到先前的游戏状态。备忘录模式可以用于实现游戏的存档和还原功能,让玩家回到游戏的不同阶段。

浏览器的历史记录。Web浏览器的历史记录功能允许用户查看和导航他们之前访问过的网页。备忘录模式可用于记录用户浏览的历史状态,包括访问的网页、页面的滚动位置等信息。

这些例子都涉及到在不同时间点捕获和恢复对象的状态,以便用户能够回到之前的状态或历史记录。备忘录模式通过将对象的状态保存到备忘录对象中,并将备忘录存储在历史记录中,使得这种行为变得更加容易和可管理。

3 结构

备忘录模式的结构包括以下部分:

发起人(Originator):负责创建备忘录对象,并可以将其状态保存到备忘录中或从备忘录中恢复状态。
备忘录(Memento):负责存储发起人的内部状态,但不会暴露给其他对象。
管理者(Caretaker):负责管理备忘录对象,通常用于存储和检索备忘录对象,但不会访问备忘录的具体内容。
下面是备忘录模式的类图:

4 实现步骤

实现备忘录模式的关键步骤包括:

创建发起人(Originator)类,它负责维护内部状态,并可以创建备忘录对象和从备忘录对象中恢复状态。
创建备忘录(Memento)类,用于存储发起人的内部状态。备忘录类应该提供方法来获取和设置状态。
创建管理者(Caretaker)类,它负责管理备忘录对象。通常,管理者会维护一个备忘录列表,可以添加和检索备忘录对象。
在发起人类中添加方法来创建备忘录对象和从备忘录对象中恢复状态。

5 代码实现(Java)

下面是一个简单的Java示例,演示了备忘录模式的实现:

// 1. 发起人(Originator)类
class TextEditor {
    private String text;

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public TextEditorMemento createMemento() {
        return new TextEditorMemento(text);
    }

    public void restoreFromMemento(TextEditorMemento memento) {
        text = memento.getState();
    }
}

// 2. 备忘录(Memento)类
class TextEditorMemento {
    private String state;

    public TextEditorMemento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

// 3. 管理者(Caretaker)类
class History {
    private List<TextEditorMemento> mementos = new ArrayList<>();

    public void addMemento(TextEditorMemento memento) {
        mementos.add(memento);
    }

    public TextEditorMemento getMemento(int index) {
        return mementos.get(index);
    }
}

public class Main {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        History history = new History();

        // 用户编辑文本
        textEditor.setText("Hello, World!");
        history.addMemento(textEditor.createMemento());

        textEditor.setText("Updated Text");
        history.addMemento(textEditor.createMemento());

        // 恢复到之前的状态
        textEditor.restoreFromMemento(history.getMemento(0));
        System.out.println(textEditor.getText()); // 输出:Hello, World!
    }
}

6 典型应用场景

备忘录模式在以下情况下特别有用:

撤销和恢复功能:允许用户撤销操作并恢复到之前的状态,例如文本编辑器、图形设计工具等。
历史记录功能:记录对象的操作历史,以便用户可以查看和导航操作历史,例如浏览器的后退和前进功能。
快照功能:在不破坏对象封装性的情况下,捕获对象的状态快照,用于实现版本控制或数据恢复。

7 优缺点

备忘录模式具有以下优点和缺点:

优点:
封装性:备忘录模式允许将对象状态的存储和恢复细节封装在备忘录类中,不会破坏对象的封装性。
撤销和恢复:可以轻松实现撤销和恢复功能,用户可以回退到先前的状态。
简化备份管理:管理者类负责管理备忘录对象,使得备份管理更加灵活和可控。
支持历史记录:备忘录模式可用于实现历史记录和快照功能,有助于跟踪对象状态的变化。
缺点:
内存消耗:如果备忘录对象较大或备忘录列表很长,可能会导致内存消耗较高。
性能开销:创建和管理备忘录对象可能会引入性能开销,特别是在频繁保存和恢复状态时。
复杂性增加:在某些情况下,备忘录模式可能会增加代码的复杂性,特别是在有多个备忘录对象和多个发起人对象时。

8 类似模式

与备忘录模式类似的模式包括状态模式和命令模式。这些模式在某些方面与备忘录模式有联系,但它们各自关注不同的问题和解决方案。

状态模式 (State Pattern):

状态模式与备忘录模式联系在于它们都涉及到对象的状态管理。在状态模式中,对象的行为随状态的变化而变化,而备忘录模式关注状态的保存和恢复,以实现撤销和恢复功能。状态模式通过将状态封装成状态对象,使对象更容易维护和扩展。备忘录模式则主要用于保存和恢复对象的状态,以实现撤销和恢复功能。状态模式通常涉及更复杂的状态转换逻辑,而备忘录模式侧重于状态的历史记录和管理。

命令模式 (Command Pattern):

命令模式和备忘录模式都可以用于实现撤销和恢复功能。在命令模式中,命令对象将操作封装成对象,可以撤销和重做。备忘录模式关注状态的保存和恢复,以便撤销和恢复对象的整体状态。命令模式通常用于构建具有撤销和重做功能的交互系统,而备忘录模式更关注对象内部状态的历史记录和管理。备忘录模式不一定需要命令对象,而命令模式通常需要一个命令队列或历史记录来管理命令。

这些模式都关注对象状态的管理,但它们各自解决不同的问题。备忘录模式主要用于实现撤销和恢复功能,状态模式用于管理对象的状态转换,命令模式用于构建具有撤销和重做功能的交互系统,而快照模式可以用于快速保存和恢复对象的状态快照。在实际应用中,根据具体需求选择适当的模式以提高代码的可维护性和可扩展性。

9 小结

备忘录模式是一种非常有用的设计模式,可以帮助我们实现撤销、恢复、历史记录和快照等功能,同时保持对象的封装性。通过定义发起人、备忘录和管理者等角色,可以清晰地组织和管理对象状态的保存和恢复过程。

在实际应用中,备忘录模式通常与其他设计模式结合使用,以满足更复杂的需求。通过谨慎地选择何时使用备忘录模式,可以提高代码的可维护性和可扩展性,同时实现更强大的用户体验。

标签:状态,历史记录,软件设计,恢复,模式,备忘录,对象
From: https://www.cnblogs.com/coodream2009/p/17738104.html

相关文章

  • Ftp基础(二):被动模式与主动模式
      Ftp即文件传输协议,说白了就是处理文件操作的。可能你还听说过Ftps、SFtp,简单说一下他们的区别吧Ftps:可以理解为Ftp+Ssl,Ftp与Ftps的关系就类似Http和Https的关系SFtp:可以理解为Ftp+SSH  总之,可以理解为Ftp就是明文传输,Ftps、SFtp采用了加密传输。    好了......
  • 随笔-责任链模式
    将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。abstractclassHandler{privateHandlernext;publicvoidsetNext(Handlernext){this.next=next;}public......
  • 设计模式-组合模式
    (目录)设计模式-组合模式什么是组合模式设计模式?组合模式是一种结构型设计模式,它允许将对象组合成树状结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在组合模式中,有两种主要类型的对象:叶子对象和组合对象。叶子对象是没有子对象......
  • 系统进入救援模式进行修复
    现象: 解决方案:(1)#journalctl查看原因   (2)可以看出是内存溢出导致进出救援模式,重启解决#/sbin/reboot-f (3)如果出现mountfailed的现象,就需要进行 umount-l/dev/sdX或者  umount-f/dev/sdX(4)检查文件系统xfs_repair-n/dev/sdX(5)修复文......
  • 设计模式
    模式是指从某个具体的形式中得到的一种抽象,在特殊的非任意性的环境中,该形式不断地重复出现。软件架构的模式描述了一个出现在特定设计语境中的特殊的再现设计问题,并为它的解决方案提供了一个经过充分验证的通用图示。解决方案图示通过描述其组成构件及其责任和相互关系以及它们的协......
  • 命令模式
    命令模式案例引入要求1.买了一套智能家电,有照明灯,风扇,冰箱,洗衣机,我们只要在手机上安装app就可以控制这些家电工作。2.这些智能家电来自不同的厂家,不想针对每一种家电都安装一个app,分别控制,希望使用一个app就可以控制全部的智能家电。3.要实现,一个app控制所有智能家电的需求,......
  • 编程基础与Python的开发模式
    1.3.1程序设计的概念1.逻辑设计(1)过程的起点是分析并确定需求。(2)从现实中抽象。(3)抽象过后是设计算法。2.程序设计(1)选择编程语言。(2)设计数据结构。(3)设计业务逻辑。(4)选择开发模式。1.3.2程序的生命周期(1)硬件部分。(2)操作系统。(3)汇编语言。(4)高级语言。(5)应......
  • 应该也算策略模式吧
    调用方自主选择策略方式:如食堂打饭,有很多窗口供选择,用户只需要去想买的窗口刷卡打饭即可三个关键角色:上下文信息类(Context):用于存放和执行需要使用的具体策略类以及客户端调用的逻辑。抽象策略类(Strategy):定义策略的共有方法。具体策略类(StrategyA等):实现抽象策略类定义的共有......
  • 软件设计模式系列之十八——迭代器模式
    1模式的定义迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。2举例说明为了更好地理解迭代器模式,让我们考虑一个简单的例子:一个图书馆......
  • 用策略模式干掉代码里大量的if-eles或则Swatch,提升B格由面向过程转为面向对象
    现象大量的分支选择型代码段看着让人头疼for(Fieldfield:declaredFields){Class<?>type=field.getType();Stringkey=field.getName();Elementresult=resultMap.addElement("result");result.addAttribute......