Memento(备忘录)

19. Memento(备忘录)

19.1 定义

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

19.2 使用场景

  ■ 需要保存和恢复数据的相关状态场景。

  ■ 提供一个可回滚的操作。

  ■ 需要监控副本的场景。例如,监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,它只是边缘应用,即使出现监控不准、错误报警也影响不大,因此一般做法是备份一个主线程中的对象,然后由分析程序来分析。

  ■ 数据库连接的事务管理使用的就是备忘录模式

19.3 c++源码实例

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 class Backup{
 5 public:
 6     string content;//需要备份
 7     int version;//不需要备份
 8 public:
 9     Backup(string content){
10         this->content = content;
11     }
12 };
13 class Document{
14 public:
15     string content;
16     string otherContent;
17 public:
18     Backup* save(){
19         cout<<"保存备份"<<endl;
20         return new Backup(content);
21     }
22     void resume(Backup* backup){
23         cout<<"恢复备份"<<endl;
24         content = backup->content;
25     }
26     string toString(){
27         return "content:" + content + ",otherContent:" + otherContent;
28     }
29 };
30 class VersionControlSystem{
31 private:
32     vector<Backup*>backups;
33     int nextVersion = 0;
34 public:
35     void add(Backup* backup){
36         backup->version = ++nextVersion;
37         backups.push_back(backup);
38     }
39     Backup* get(int version){
40         for(int i=0;i<backups.size();i++){
41             if(backups[i]->version == version)
42             return backups[i];
43         }
44         return NULL;
45     }
46     Backup* getLastVersion(){
47         int len = backups.size();
48         if(len>0)
49             return backups[len-1];
50         else
51             return NULL;
52     }
53 };
54 int main(){
55     VersionControlSystem vcs;
56     Document document;
57     document.content = "content1";
58     document.otherContent = "otherContent1";
59     vcs.add(document.save());
60     cout<<document.toString()<<endl;
61     document.content = "content2";
62     document.otherContent = "otherContent2";
63     vcs.add(document.save());
64     cout<<document.toString()<<endl;
65 
66     document.resume(vcs.get(1));
67     cout<<document.toString()<<endl;
68 
69     document.resume(vcs.getLastVersion());
70     cout<<document.toString()<<endl;
71 
72 
73 }

 

posted @ 2020-11-08 14:10  昨日明眸  阅读(150)  评论(0)    收藏  举报