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 }
我心自有明月在,不堕地狱不跪佛

浙公网安备 33010602011771号