memento模式
Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态。 它是行为设计模式的一部分,与算法和对象之间的职责分配有关。
行为模式描述了处理对象或类之间的通信的模式。 在恢复对象状态时,Memento设计模式具有很大的适用性。 需要用户退回到先前状态的应用程序利用了记忆设计模式。
这种设计模式的目的是通过不将信息暴露在所需对象之外而不违反封装原理。 在本文中,我们将讨论可以使用memento设计模式的场景,描述什么是memento设计模式,并讨论其优缺点。 让我们开始吧
纪念品设计模式是什么?
纪念品设计模式的目的是外部化对象的内部状态,以便以后可以将对象恢复到该状态而不会违反封装原理。 游戏应用程序需要维护玩家玩过的关卡的快照。 随着用户在游戏中前进到不同级别,遇到游戏结束情况的机会增加。
大多数游戏允许用户从上一个级别重新启动游戏。 在游戏中存储和恢复状态的大多数情况下,都使用了记忆设计模式的思想。
可以从绘图应用程序(例如Microsoft Windows操作系统中的paint)或任何其他支持连接对象的图形编辑器中绘制另一个示例。 我们可以创建两个圈子,并用一条线将它们加入。 现在,如果我们通过选择整个图形或通过任何其他方式移动矩形系统,则矩形应保持连接状态。
图形编辑器确保线适当延伸以保持矩形之间的连接。 如果我们尝试创建自己的图形编辑器,则可以使用memento设计模式来确保实现所需的效果。 这样的应用程序利用一个对象,该对象使用数学方程式来计算长度,位置和角度。
该对象借助memento设计模式的工具箱对象来存储先前的约束(长度,位置,角度)。 这样,如果用户下次移动矩形系统,则可以使用先前的状态来确定下一位置。
备忘录设计模式由一个对象组成,该对象存储另一个对象的内部状态快照,该快照是备忘录的创建者。 撤消机制在需要来自始发者状态的检查点列表时,向始发者请求纪念品。 发起者是使用表征其当前状态的信息来初始化纪念品的人。
限制是始发者是唯一存储和从memento中检索信息的人。 让我们逐一查看这些参与者,以清楚地了解所有这些含义-
1.纪念品
记忆对象存储原始对象的内部状态。
发起者可以访问memento对象,任何其他对象都不能直接与其交互。
2.发起人
发起者本身负责创建一个包含其当前内部状态快照的纪念品。
此外,它使用纪念品恢复内部状态
3.看守
看守类负责保存memento的状态快照。 它维护一个状态列表,然后由始发者用来切换回该状态。 您将借助memento设计模式的示例了解此类的用法。
备忘录设计模式示例
1.纪念品
memento类由状态变量组成,在我们的例子中,我们使用普通字符串表示状态。 记忆类有两种方法; 一个是构造函数,并返回当前状态。
图:Java中的备忘录设计模式示例
Memento保留单个快照,然后由看守对象将其保留为列表
2.发起人
发起者负责设置对象的状态,并使用setState()方法进行设置。 saveStateToMemento方法返回一个新的Memento对象,其中存储了当前状态,该状态存储在CareTaker对象的memento列表中。
getStateFromMemento返回状态的当前快照。
图:java中的备忘录设计模式示例–发起者发起状态
3. CareTaker
看守类以memento对象的形式维护状态快照列表。 从看守对象中,我们可以跳到存储的不同状态,因为它是包含完整列表的状态。 get方法使用传递给它的索引返回快照。
图:Java中的备忘录设计模式示例– CareTaker维护状态列表
4.备忘录模式演示
如您所见,原始对象正在设置状态,并且记忆对象的快照已添加到由照管对象维护的列表中。 为了获得当前级别,我们可以直接使用原始对象中的getState()方法。 但是,看守对象是我们可以从中获取状态快照并将其反映在发起者类上的对象。
getStateFromMemento()方法获取我们要跳转的“级别”(状态),并将其设置为Originator对象的状态变量。 现在,如果我们直接使用getState()方法,则可以看到我们已经从看守对象维护的列表中恢复了先前保存的状态。
图:java中的memento设计模式示例– Memento模式的实际应用
使用memento设计模式的优缺点是什么?
优点:
- 如果封装,Memento通过避免暴露仅由始发者管理的信息来保留边界。 但是,正如我们在代码示例中看到的那样,它应该存储在发起者之外。 我们将其存储在看守对象中。
- 记忆设计模式允许我们通过看守者维护状态列表来使代码在客户端保持简单。
- 将保存的状态保持在关键对象之外有助于保持凝聚力。
- 它为实现应用程序的恢复/撤消功能提供了一种简便的方法。
缺点:
- 如果发起者必须复制大量信息以存储在内存中,则内存可能会导致大量使用内存。
- 在大多数语言(例如JavaScript)中,使用记忆设计模式并不是一个简单的主意。 很难确保只有始发者才能访问纪念品的状态。
综上所述:
Memento设计模式有两个目标:
- 一种是保存系统关键对象的重要状态。
- 另一个是维护关键对象的封装。
阅读: Java中的工厂设计模式
备忘录设计模式通过提供一个选项来保持我们要保存的状态与关键对象分离,从而促进了单一责任原则。 我们看到的那个单独的对象是Memento对象。 但是,状态的快照列表由看守对象而不是备忘录保存。
翻译自: https://hackernoon.com/memento-design-pattern-overview-4r7p3wol
memento模式