一.小结
- 定义:在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态。这样可以在以后将对象恢复到原先的状态。
- 优点:1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态 2.实现了信息的封装,使得用户不需要关心状态的保存细节
- 缺点:消耗资源,如果类的成员变量过多,势必会占用比较在的资源,而且每次保存都会消耗一定的内存
- 使用场景:1.需要保存恢复数据的相关状态场景 2.提供一个可回滚的操作
- 通用UML图
二.例子
通用的备忘录模式代码如下:
-
起始人
// 自身状态 private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } // 创建备忘录 public Memo createMemo() { return new Memo(state); } // 通过备忘录恢复自身状态 public void restoreMemo(Memo memo) { setState(memo.getState()); }
-
备忘录
public class Memo { private String state; public Memo(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } }
-
备忘录管理员
public class Caretaker { private Memo memo; public Memo getMemo() { return memo; } public void setMemo(Memo memo) { this.memo = memo; } }
-
情景类
public class Client { public static void main(String[] args) { // 起始人 Originator originator = new Originator(); originator.setState("状态1"); // 备忘录管理员 Caretaker caretaker = new Caretaker(); caretaker.setMemo(originator.createMemo()); // 更新状态 originator.setState("状态2"); System.out.println("getState: " + originator.getState()); // 恢复状态 originator.restoreMemo(caretaker.getMemo()); System.out.println("getState: " + originator.getState()); } }