备忘录模式
# 备忘录模式
# 一、备忘录模式
原理:备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
优缺点
- 1 优点
- 封装性:备忘录模式允许对象的状态封装在备忘录对象中,使得这些状态对外部对象不可见,从而保护了对象的封装性。
- 状态恢复:备忘录模式提供了一种方便的机制,使得对象可以在需要时恢复到之前的某个状态,从而支持撤销操作或者回滚操作。
- 简化了原发器类:备忘录模式将状态保存和恢复的逻辑从原发器中分离出来,使得原发器类的实现更加简洁,只需要关注自身的核心业务逻辑。
- 多次撤销/回滚:备忘录模式允许保存多个备忘录对象,从而支持多次撤销或回滚操作,使得系统更加灵活。。
- 2 缺点
- 资源消耗:如果需要保存的对象状态非常庞大,备忘录模式可能会消耗大量的内存资源。
- 潜在的性能影响:备忘录模式可能会增加对象的处理时间,特别是在频繁保存和恢复状态的情况下,可能会对系统性能产生一定的影响。
- 过多的备忘录对象:如果备忘录对象过多,可能会增加管理和维护的复杂性,特别是在需要支持多次撤销或回滚的情况下。
- 破坏封装性:在某些情况下,备忘录模式可能会破坏对象的封装性,因为备忘录对象需要访问原发器的私有成员来保存和恢复状态。
适用场景
- 撤销操作:当需要在应用中实现撤销操作时,备忘录模式是一个很好的选择。它允许你在需要时保存对象的状态,并能在之后将对象恢复到之前的状态,从而支持撤销操作。
- 编辑器和文档管理器:在编辑器或文档管理器中,备忘录模式可以用于保存文档的历史状态。这样用户就可以随时撤销编辑操作或回到之前的版本。
- 游戏状态管理:在游戏开发中,备忘录模式可以用于保存游戏状态,比如保存游戏进度或者回放游戏操作。
- 事务管理:在数据库管理系统或事务处理系统中,备忘录模式可以用于事务的回滚和恢复,以确保数据的一致性和完整性。
- 命令模式的补充:备忘录模式可以与命令模式结合使用,用于保存命令的历史状态,从而支持撤销和重做操作。
- 配置管理:在系统配置管理中,备忘录模式可以用于保存配置的历史状态,以便在需要时进行恢复或回滚。
# 二、备忘录模式基本代码
发起人类
class Originator { private String state; // 设置状态 public void setState(String state) { this.state = state; System.out.println("State set to: " + state); } // 获取状态 public String getState() { return state; } // 创建备忘录 public Memento saveStateToMemento() { return new Memento(state); } // 从备忘录恢复状态 public void getStateFromMemento(Memento memento) { state = memento.getState(); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24备忘录类
public static class Memento { private final String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }
1
2
3
4
5
6
7
8
9
10
11管理备忘录类
class Caretaker { private List<Originator.Memento> mementoList = new ArrayList<>(); public void add(Originator.Memento state) { mementoList.add(state); } public Originator.Memento get(int index) { return mementoList.get(index); } }
1
2
3
4
5
6
7
8
9
10
11客户端
public class ConcreteIterator implements Iterator { public static void main(String[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker(); // 设置状态并保存到备忘录 originator.setState("State #1"); caretaker.add(originator.saveStateToMemento()); originator.setState("State #2"); caretaker.add(originator.saveStateToMemento()); originator.setState("State #3"); caretaker.add(originator.saveStateToMemento()); // 恢复状态 System.out.println("Current State: " + originator.getState()); originator.getStateFromMemento(caretaker.get(0)); System.out.println("First saved State: " + originator.getState()); originator.getStateFromMemento(caretaker.get(1)); System.out.println("Second saved State: " + originator.getState()); originator.getStateFromMemento(caretaker.get(2)); System.out.println("Third saved State: " + originator.getState()); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 三、实现方式
- 创建备忘录(Memento)类,用于保存发起人对象的状态。
- 创建发起人(Originator)类,该类有保存状态、恢复状态的方法,以及一个用于创建备忘录对象的方法。
- 创建管理者(Caretaker)类,用于保存备忘录对象。
- 在客户端代码中,创建发起人对象并设置其状态,然后保存状态到备忘录对象中。
- 如果需要恢复状态,从管理者处获取备忘录对象,然后使用发起人对象恢复状态。
编辑 (opens new window)