一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

设计模式之备忘录模式

备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:

  在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretaker则是负责管理Memento。而保存的内容的具体的组织方式什么的都封装在Memento中了。这样做耦合性很低,方便维护和扩展。示例代码如下:

复制代码
 1 // MemoModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 #include <string>
 5 
 6 class Memo;
 7 
 8 class Originator
 9 {
10 private:
11     std::string m_state;
12 public:
13     Memo * createMemo();
14     void show()
15     {
16         std::cout << m_state << std::endl;
17     }
18     void setState(std::string str)
19     {
20         m_state = str;
21     }
22     void recoverState(Memo * p);
23 };
24 
25 class Memo
26 {
27 public:
28     std::string m_state;
29     Memo(std::string str)
30     {
31         m_state = str;
32     }
33 
34 };
35 
36 Memo * Originator::createMemo()
37 {
38     return new Memo(m_state);
39 }
40 
41 void Originator::recoverState(Memo * p)
42 {
43     setState(p->m_state);
44 }
45 
46 class Caretaker
47 {
48 private:
49     Memo * m_pMemo;
50 public:
51     Caretaker() : m_pMemo(nullptr) {}
52     ~Caretaker()
53     {
54         if (nullptr != m_pMemo)
55             delete m_pMemo;
56     }
57     Memo * getMemo()
58     {
59         return m_pMemo;
60     }
61     void setMemo(Memo * p)
62     {
63         m_pMemo = p;
64     }
65 };
复制代码

测试代码如下:

复制代码
 1 #include <iostream>
 2 #include "MemoModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 备忘录模式
 8     Originator * p = new Originator;
 9     Caretaker * pCare = new Caretaker;
10     // 设置状态
11     p->setState("A");
12     p->show();
13     // 创建备忘录
14     pCare->setMemo(p->createMemo());
15     // 更改状态
16     p->setState("B");
17     p->show();
18     // 恢复状态
19     p->recoverState(pCare->getMemo());
20     p->show();
21     delete pCare;
22     delete p;
23 
24     getchar();
25     return 0;
26 }
复制代码

测试结果如下图:

  备忘录模式把要保存的细节封装在了Memo类中,如果要修改保存细节的话,不会影响到客户端。备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。

posted on   一杯清酒邀明月  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-07-07 Qt 编译时报错“退出,退出代码2”的原因
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示