长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

  • 行为型模式

    • 责任链模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 时序图
      • 示例代码
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Method Pattern)
    • 访问者模式(Visitor Pattern)
  • 设计模式
  • 行为型模式
DC Wang
2023-05-28
目录

备忘录模式(Memento Pattern)

# 备忘录模式(Memento Pattern)

# 概念

备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。该模式用于将对象的状态保存到外部,并在需要时将其恢复回去。

# 思想

备忘录模式通过引入备忘录对象,允许在不暴露对象实现细节的情况下保存和恢复其状态。原始对象(发起人)创建一个备忘录对象,它包含原始对象的内部状态。备忘录对象可以由外部对象(管理者)持有,并在需要时传递给原始对象以进行状态恢复。

# 角色

  1. Originator(发起人):需要被保存和恢复状态的对象。它创建备忘录对象并可以从备忘录中恢复状态。
  2. Memento(备忘录):存储原始对象的内部状态。它可以包含一个或多个备忘录属性。
  3. Caretaker(管理者):负责保存备忘录对象,并在需要时将其提供给原始对象进行状态恢复。
  4. Client(客户端):与发起人对象和管理者对象进行交互,触发备忘录的创建和恢复。

# 优点

  • 可以在不破坏封装性的前提下实现对象的状态保存和恢复。
  • 允许对对象的状态进行快照,并在需要时进行回滚操作。
  • 可以简化原始对象的实现,将状态管理交给备忘录和管理者对象。

# 缺点

  • 如果原始对象的状态较大或者包含敏感信息,备忘录的创建和恢复可能会消耗较多的资源。
  • 需要额外的代码实现备忘录和管理者对象,增加了系统的复杂性。

# 类图

@startuml
class Originator {
  - state: String
  + setState(state: String): void
  + getState(): String
  + createMemento(): Memento
  + restoreMemento(memento: Memento): void
}
class Memento {
  - state: String
  + getState(): String
}
class Caretaker {
  - mementos: List<Memento>
  + addMemento(memento: Memento): void
  + getMemento(index: int): Memento
}
class Client {
  + main(): void
}

Originator --> Memento
Originator --> Caretaker
Client --> Originator
Client --> Caretaker
@enduml
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

# 时序图

@startuml
hide footbox
title 备忘录模式 - 时序图

participant Client
participant Originator
participant Caretaker
participant Memento

Client -> Originator: setState("State 1")
Client -> Originator: setState("State 2")
Client -> Caretaker: addMemento(memento1)
Originator -> Memento: getState()
Caretaker -> Memento: getState()
Caretaker -> Originator: createMemento()
Client -> Originator: setState("State 3")
Client -> Caretaker: addMemento(memento2)
Originator -> Memento: getState()
Caretaker -> Memento: getState()
Caretaker -> Originator: createMemento()
Client -> Originator: restoreMemento(memento1)
Originator -> Memento: getState()
Originator -> Caretaker: restoreMemento(memento1)
Caretaker -> Memento: getState()

@enduml
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

# 示例代码

下面是一个使用C++实现备忘录模式的简单示例代码:

#include <iostream>
#include <string>
#include <vector>

class Memento {
private:
    std::string state;

public:
    Memento(const std::string& state) : state(state) {}

    std::string getState() const {
        return state;
    }
};

class Originator {
private:
    std::string state;

public:
    void setState(const std::string& state) {
        this->state = state;
    }

    std::string getState() const {
        return state;
    }

    Memento createMemento() {
        return Memento(state);
    }

    void restoreMemento(const Memento& memento) {
        state = memento.getState();
    }
};

class Caretaker {
private:
    std::vector<Memento> mementos;

public:
    void addMemento(const Memento& memento) {
        mementos.push_back(memento);
    }

    Memento getMemento(int index) const {
        return mementos[index];
    }
};

int main() {
    Originator originator;
    Caretaker caretaker;

    originator.setState("State 1");
    originator.setState("State 2");
    caretaker.addMemento(originator.createMemento());

    originator.setState("State 3");
    caretaker.addMemento(originator.createMemento());

    originator.restoreMemento(caretaker.getMemento(0));

    std::cout << "Current state: " << originator.getState() << std::endl;

    return 0;
}
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

代码运行结果:

Current state: State 2
1

上述示例代码中,客户端(Client)通过与发起人(Originator)和管理者(Caretaker)进行交互,演示了备忘录模式的基本流程。首先,客户端设置发起人的状态,并创建一个备忘录(Memento),并将备忘录保存到管理者中。然后,客户端修改发起人的状态,并再次创建一个备忘录并保存到管理者中。最后,客户端从管理者中获取第一个备忘录,并将其恢复到发起人中,输出当前状态为 "State 2"。这样,备忘录模式成功地保存了发起人对象的状态并实现了状态的恢复。

编辑 (opens new window)
#设计模式#行为型模式
上次更新: 2023/06/09, 13:17:31
中介者模式(Mediator Pattern)
观察者模式(Observer Pattern)

← 中介者模式(Mediator Pattern) 观察者模式(Observer Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式