首页 > 编程语言 >C++ 设计模式之备忘录模式

C++ 设计模式之备忘录模式

时间:2023-07-07 14:00:13浏览次数:53  
标签:设计模式 show Caretaker Memo C++ 备忘录 include pMemo

设计模式之备忘录模式

备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其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类中,如果要修改保存细节的话,不会影响到客户端。备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。

标签:设计模式,show,Caretaker,Memo,C++,备忘录,include,pMemo
From: https://www.cnblogs.com/ybqjymy/p/17534789.html

相关文章

  • C++ 设计模式之责任链模式
    设计模式之责任链模式责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下: 每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时......
  • C++ 设计模式之中介者模式
    设计模式之中介者模式中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下: Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类......
  • C++ 设计模式之享元模式
    设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。......
  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......