目录
  1. 1. 备忘录模式
    1. 1.1. 定义
    2. 1.2. 代码实现
      1. 1.2.1. 准备
      2. 1.2.2. 备份
      3. 1.2.3. 游戏
      4. 1.2.4. 场景实现
    3. 1.3. 备忘录的扩展
    4. 1.4. 应用实现
    5. 1.5. 注意事项
备忘录模式

备忘录模式

定义

Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

代码实现

准备

我们可以用备忘录模式来模拟游戏,游戏开始之后就开始备份游戏开始状态,当游戏失败,游戏结束,我们需要会到游戏开始就需要游戏开始的备份。

备份

  1. 备忘录管理员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.example.memento;

/**
* 备忘录管理员
*/
public class Caretaker {
private Memento memento ;
public Memento getMemento(){
return this.memento ;
}
public void setMemento(Memento memento){
this.memento = memento ;
}
}
  1. 备忘录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package org.example.memento;

/**
* 备忘录类,用来备份状态
*/
public class Memento {
private String state = "";
/* 初始化备份的状态 */
public Memento(String state){
this.state = state ;
}
public String getState(){
return this.state ;
}

public void setState(String state){
this.state = state ;
}
}

游戏

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
package org.example.memento;

/**
* 现在我们开始玩一个游戏,游戏中途失败,然后需要重新开始,就需要备份开始阶段,然后从开始阶段重新开始
* 游戏备份
*/
public class Game {
/* 状态 */
private String state = "" ;

/* 用来改变状态 */
public void changeState(){
this.state = "游戏结束";
}

/* 获取当前状态 */
public String getState(){
return this.state ;
}

/* 设置当前状态 */
public void setState(String state){
this.state = state ;
}

/* 创建当前状态的备份 */
public Memento createMemento(){
return new Memento(this.state);
}

/* 将当备份的状态恢复为当前状态 */
public void restoreMemento(Memento memento){
this.setState(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
25
26
27
28
public class App {
/**
* 备忘录模式
* @param args
*/
public static void main(String[] args) {
/* 创建一个游戏 */
Game game = new Game();

/* 开始游戏 */
game.setState("游戏开始");
System.out.println("=======游戏开始状态=======");
System.out.println(game.getState());

/* 创建游戏备份 */
Caretaker caretaker = new Caretaker();
caretaker.setMemento(game.createMemento());
/* 游戏结束 */
game.changeState();
System.out.println("=======游戏失败状态=======");
System.out.println(game.getState());

/* 使用游戏备份,会到游戏开始 */
game.restoreMemento(caretaker.getMemento());
System.out.println("=======游戏恢复状态=======");
System.out.println(game.getState());
}
}

备忘录的扩展

应用实现

  1. 需要保存和恢复数据的相关场景。
  2. 提供回滚操作,包括文本回退等。
  3. 需要监控的副本场景中,这个需要监控的场景不复杂,可以直接备份。
  4. 数据库连接的事务管理就是使用备忘录模式。

注意事项

  1. 备忘录的生命周期。备忘录创建后就要在最近就使用,不能拖的太长。
  2. 备忘录的性能。不要频繁的使用备忘录。每次创建一个备份都要消耗资源。
文章作者: rack-leen
文章链接: http://yoursite.com/2020/01/04/Java/Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F/%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论