设计模式之美:Memento(备忘录)

简介:

索引

别名

  • Token

意图

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

Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.

结构

参与者

Memento

  • Memento 存储 Originator 对象的内部状态。Originator 根据需要决定 Memento 存储那些内部状态。
  • 防止 Originator 以外的其他对象访问 Memento。Memento 可实现两个接口,Caretaker 只能看到 Memento 的窄接口,Originator 可以看到宽接口。

Originator

  • Originator 创建一个 Memento,用以记录当前时刻的内部状态。
  • 使用 Memento 恢复内部状态。

Caretaker

  • 负责保存 Memento。
  • 不能对 Memento 的内容进行操作和检查。

适用性

在以下情况下可以使用 Memento 模式:

  • 必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态。
  • 如果一个用接口来让其他对象直接得到的这些状态,将会暴露对象的实现细节并破坏对象的封装性。

效果

  • 保持封装边界。
  • 简化了 Originator。
  • 定义窄接口和宽接口。
  • 使用和维护 Memento 的潜在代价。

相关模式

  • 可以使用 Memento 存储 Command 的内部状态,以支持撤销操作。
  • Memento 可以使用 Iterator 进行迭代。

实现

Caretaker 向 Originator 请求一个 Memento,保留一段时间后,将其送回 Originator。

实现方式(一):Memento 模式结构样式代码。

Memento 有两个接口:一个为 Originator 所使用的宽接口,一个为其他对象所使用的窄接口。

复制代码
 1 namespace MementoPattern.Implementation1
 2 {
 3   public class Memento
 4   {
 5     private readonly string _state;
 6 
 7     public Memento(string state)
 8     {
 9       _state = state;
10     }
11 
12     public string GetState()
13     {
14       return _state;
15     }
16   }
17 
18   public class Originator
19   {
20     public string State { get; set; }
21 
22     public Memento CreateMemento()
23     {
24       return (new Memento(State));
25     }
26 
27     public void SetMemento(Memento memento)
28     {
29       State = memento.GetState();
30     }
31   }
32 
33   public class Caretaker
34   {
35     public Memento Memento { get; set; }
36   }
37 
38   public class Client
39   {
40     public void TestCase1()
41     {
42       var originator = new Originator { State = "State A" };
43       Console.WriteLine(originator.State);
44 
45       var memento = originator.CreateMemento();
46       var caretaker = new Caretaker { Memento = memento };
47 
48       originator.State = "State B";
49       Console.WriteLine(originator.State);
50 
51       originator.SetMemento(caretaker.Memento);
52       Console.WriteLine(originator.State);
53     }
54   }
55 }
复制代码
目录
相关文章
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
85 0
|
设计模式 存储 数据库
设计模式~备忘录模式(memento)-22
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。记录快照(瞬间状态)/存盘。 目录  (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码
45 1
|
设计模式 存储 Java
Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式
Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式
75 1
|
设计模式 数据库 Windows
备忘录设计模式解读
备忘录设计模式解读
|
设计模式 存储 Java
Java设计模式-备忘录模式(Memento)
Java设计模式-备忘录模式(Memento)
|
设计模式 人工智能 Java
设计模式是什么鬼(备忘录)
设计模式是什么鬼(备忘录)
设计模式是什么鬼(备忘录)
|
设计模式 存储
设计模式之备忘录
设计模式之备忘录
120 0
设计模式之备忘录
|
存储 设计模式 数据库
从零开始学设计模式(十七): 备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern)又叫快照模式,它指的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。它是一种对象行为型模式。
153 0
从零开始学设计模式(十七): 备忘录模式(Memento Pattern)
|
设计模式 存储 Java
【愚公系列】2021年12月 二十三种设计模式(十八)-备忘录模式(Memento Pattern)
【愚公系列】2021年12月 二十三种设计模式(十八)-备忘录模式(Memento Pattern)
158 0
【愚公系列】2021年12月 二十三种设计模式(十八)-备忘录模式(Memento Pattern)
|
存储 设计模式 Java
浅谈JAVA设计模式之——备忘录模式(Memento)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
183 0
浅谈JAVA设计模式之——备忘录模式(Memento)