设计模式-18-备忘录模式

设计模式-18-备忘录模式

个人github地址:HibisciDai

设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai

processon在线UML类图:processon

[TOC]

设计模式-18-备忘录模式

备忘录模式(Memento Pattern)

意图

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

without violating encapsulation,capture an object’s internal state so that the object can be returned to this state later,promote under to full object status.

主要解决

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用

了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,类似”后悔药”。

关键代码

客户不与备忘录类耦合,与备忘录管理类耦合。

如何解决

通过一个备忘录类专门存储对象状态。

应用实例

  • 后悔药。
  • 打游戏时的存档。
  • Windows 里的 ctri + z。
  • IE 中的后退。
  • 数据库的事务管理。

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
  • 实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景

  • 需要保存/恢复数据的相关状态场景。
  • 提供一个可回滚的操作。

注意事项

  • 为了符合迪米特原则,还要增加一个管理备忘录的类。
  • 为了节约内存,可使用原型模式+备忘录模式。

创建备份点,需要时候恢复。

案例1

回到过去:
有个男孩,有一天遇到一个女孩,状态特别好,相处中,吵架,冷战……想回到那天与女孩相遇的状态。

第一次优化:Main方法调用
第二次优化:新建备忘录类
第三次优化:新建另一个类来管理备忘录

类图

代码

pattern18.memento.demo1

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
27
28
29
30
31
32
33
34
35
36
public class Boy {
String myState;

Memento createMemento() {
return new Memento(myState);
}

void restoreMemento(Memento memento) {
myState = memento.myState;
}
}

public class CareTaker {
Memento memento;

public CareTaker(Memento memento) {
super();
this.memento = memento;
}

public Memento getMemento() {
return memento;
}

public void setMemento(Memento memento) {
this.memento = memento;
}
}

public class Memento {
String myState;

Memento(String myState) {
this.myState = myState;
}
}

测试输出

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Boy boy = new Boy(); // first boy
boy.myState = "super!!";
CareTaker c = new CareTaker(boy.createMemento());// make memories
boy.myState = "terrible!!";
boy.restoreMemento(c.getMemento());
System.out.println(boy.myState);
}
}
1
super!!
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/05/23/设计模式-18-备忘录模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里