Java设计模式:备忘录模式详解

版权申诉
0 下载量 43 浏览量 更新于2024-07-08 收藏 115KB PDF 举报
"Java设计模式笔记中的备忘录模式(Memento Pattern)" 备忘录模式是一种行为设计模式,主要用于在不违反封装原则的前提下,保存一个对象的内部状态,并能在之后恢复该对象到之前保存的状态。这个模式的核心是通过创建一个备忘录对象来保存原对象(称为发起人角色,Originator)的内部状态,然后由另一个对象(称为负责人角色,Caretaker)负责存储和传递备忘录,确保只有发起人能够恢复其状态。 在备忘录模式中,存在以下三个主要角色: 1. 发起人角色(Originator):这是需要保存和恢复状态的对象。发起人创建备忘录对象,通常包含一个工厂方法用于创建备忘录,并且有一个恢复方法来利用备忘录恢复其状态。在给定的Java代码中,`Originator` 类有一个私有的 `state` 字符串字段,代表内部状态,以及创建和恢复备忘录的方法。 ```java public class Originator { private String state; public Memento createMemento() { return new Memento(state); } public void restoreMemento(Memento memento) { this.state = memento.getState(); } } ``` 2. 备忘录角色(Memento):备忘录对象负责存储发起人的内部状态。备忘录通常有两个接口:窄接口和宽接口。窄接口仅允许负责人对象持有备忘录,而宽接口则允许发起人访问并恢复其内部状态。备忘录类可能包含私有构造函数和访问器方法,以确保外部对象不能直接修改状态。 ```java public class Memento { private String state; // 私有构造函数 private Memento(String state) { this.state = state; } // 宽接口(仅对发起人可见) public String getState() { return state; } } ``` 3. 负责人角色(Caretaker):负责人对象负责保存备忘录,但不应查看或修改备忘录的内容。在实际应用中,负责人可能是一个集合类,用于存储多个备忘录,或者是一个简单的变量,仅保存单个备忘录。 ```java public class Caretaker { private List<Memento> mementos = new ArrayList<>(); public void addMemento(Memento memento) { mementos.add(memento); } public Memento getMemento(int index) { return mementos.get(index); } } ``` 备忘录模式常与其他设计模式结合使用,如命令模式和迭代器模式。例如,在命令模式中,备忘录模式可用于撤销操作,存储命令执行前的状态。在迭代器模式中,备忘录模式可以用于保存迭代过程中的某个状态,以便稍后恢复。 备忘录模式提供了一种安全的方式,允许对象在不破坏其封装性的情况下记录和恢复其状态,适用于需要保存和恢复状态的场景,如游戏存档、文本编辑器的撤销/重做功能等。然而,过度使用备忘录模式可能会导致内存消耗增加,因为需要存储多个状态的备忘录对象。因此,应谨慎评估何时使用备忘录模式,并权衡其带来的好处与潜在的性能影响。