【设计模式】备忘录模式

一、定义

  备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

二、结构

备忘录模式的结构

备忘录模式的主要角色如下。 

  1)发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  2)备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  3)管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

结构图

    

三、代码实现

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         Originator originator = new Originator();
 5         Caretaker caretaker = new Caretaker();
 6         // 状态1
 7         originator.setState("状态1");
 8         System.out.println("初始状态:" + originator.getState());
 9         caretaker.saveMemento(originator.createMemento());
10         // 状态2
11         originator.setState("状态2");
12         System.out.println("新的状态:" + originator.getState());
13         // 恢复状态
14         originator.restoreMemento(caretaker.getLastMemento());
15         System.out.println("恢复状态:" + originator.getState());
16     }
17 }
18 
19 // 备忘录
20 class Memento {
21     private String state;
22 
23     public Memento(String state) {
24         this.state = state;
25     }
26 
27     public String getState() {
28         return state;
29     }
30 
31     public void setState(String state) {
32         this.state = state;
33     }
34 }
35 
36 // 发起人
37 class Originator {
38     private String state;
39 
40     public Memento createMemento() {
41         return new Memento(state);
42     }
43 
44     public void restoreMemento(Memento m) {
45         this.setState(m.getState());
46     }
47 
48     public String getState() {
49         return state;
50     }
51 
52     public void setState(String state) {
53         this.state = state;
54     }
55 }
56 
57 // 管理者
58 class Caretaker {
59     private List<Memento> mementos = new ArrayList<>();
60 
61     public Memento getLastMemento() {
62         return mementos.get(mementos.size() - 1);
63     }
64 
65     public void saveMemento(Memento memento) {
66         mementos.add(memento);
67     }
68 }
原文地址:https://www.cnblogs.com/h--d/p/14713937.html