备忘录模式

理论

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

 备忘录模式应用场景:

  1. 比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分,Originator 可以根据保存的 Memento 信息还原到前一状态。

  2. 当角色的状态改变的时候,有可能这个状态无效,这时候可以使用暂时存储起来的备忘录将状态复原。

实例

模拟游戏场景,一个游戏角色有生命力、攻击力、防御力等数据,在打Boss前后会不一样,我们允许玩家与Boss决斗的结果不理想时可以让游戏恢复到决斗前

UML类图

代码实现

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
using namespace std;
 
//游戏状态存储箱类
class RoleStateMemento {
public:
    RoleStateMemento(int _vit, int _atk, int _def) :vit(_vit), atk(_atk), def(_def) {}
    int GetVit() { return vit; }
    int GetAtk() { return atk; }
    int GetDef() { return def; }
 
private:
    int vit;
    int atk;
    int def;
};
 
//发起人(Originator)类
class Originator {
public:
    //初始化状态
    void SetState() {
        vit = 100;
        atk = 100;
        def = 100;
    }
 
    //战斗后状态
    void Battle() {
        vit = 0;
        atk = 0;
        def = 0;
    }
 
    //保存当前状态到备忘录
    RoleStateMemento* SaveState() { return new RoleStateMemento(vit, atk, def); }
 
    //恢复备忘录
    void RecoveryState(RoleStateMemento* memento){
        this->vit = memento->GetVit();
        this->atk = memento->GetAtk();
        this->def = memento->GetDef();
    }
 
    //显示当前状态
    void Display() {
        cout << "当前状态: " << endl;
        cout << "生命力: " << vit << " ";
        cout << "攻击力: " << atk << " ";
        cout << "防御力: " << def << " ";
        cout << endl;
    }
 
private:
    int vit;  //生命力
    int atk;  //攻击力
    int def;  //防御力
};
 
//角色状态管理类
class RoleStateCaretaker {
public:
    void SetMemento(RoleStateMemento* memento) { Memento = memento; }
    RoleStateMemento* GetMemento() { return Memento; }
 
private:
    RoleStateMemento* Memento;
};
 
//客户端代码
int main()
{
    //战斗前
    Originator role;
    role.SetState();
    role.Display();
 
    //保存当前进度
    RoleStateCaretaker CreateMemento;
    CreateMemento.SetMemento(role.SaveState());
 
    //战斗后
    role.Battle();
    role.Display();
 
    //恢复备忘录
    role.RecoveryState(CreateMemento.GetMemento());
    role.Display();
 
    system("pause");
    return 0;
}

运行结果

好处:把要保存的细节给封装在了 Memento 中了,如果要更改保存的细节不会影响客户端。

posted @   KYZH  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示

目录导航