文章目录备忘录模式结构实现特点备忘录模式备忘录模式提供了一种状态恢复的实现机制使得用户可以方便地回到一个特定的历史步骤当新的状态无效或者存在问题时可以使用暂时存储起来的备忘录将状态复原当前很多软件都提供了撤销( Undo)操作其中就使用了备忘录模式。备忘录模式又称为标记Token模式。备忘录模式是一种软件设计模式它提供了将对象恢复到其先前状态通过回滚撤消的能力在不破坏封装的前提下捕获一个对象的内部状态并在该对象之外保存这个状态这样可以在以后将对 象恢复到原先的状态。结构在备忘录模式结构图中包含如下几个角色Originator原发器它是一个普通类可以创建一个备忘录并存储它的当前内部状态也可以使用备忘录来恢复其内部状态一般将需要保存内部状态的类设计为原发器。Memento备忘录存储原发器的内部状态根据原发器来决定保存哪些内部状态。备忘录的设计一般可以参考原发器的设计根据实际需要确定备忘录类中的属性。需要注意的是除了原发器本身与负责人类之外备忘录对象不能直接供其他类使用原发器的设计在不同的编程语言中实现机制会有所不同。Caretaker负责人负责人又称为管理者它负责保存备忘录但是不能对备忘录的内容进行操作或检查。在负责人类中可以存储一个或多个备忘录对象它只负责存储对象而不能修改对象也无须知道对象的实现细节。注意在设计备忘录类时需要考虑其封装性除了Originator类不允许其他类来调用备忘录类Memento的构造函数与相关方法如果不考虑封装性允许其他类调用setState()等方法将导致在备忘录中保存的历史状态发生改变通过撤销操作所恢复的状态就不再是真实的历史状态备忘录模式也就失去了本身的意义。在使用Java语言实现备忘录模式时一般通过将Memento类与Originator类定义在同一个包中来实现封装在Java语言中可使用默认访问标识符来定义Memento类即保证其包内可见。实现// 历史备忘录类classHistory{public:History(string msg):m_msg(msg){}stringgetHistory(){returnm_msg;}private:string m_msg;};// 鬼子classJiaoPenJi{public://代表鬼子在我国犯下了某一个罪行参数对应的就是相关的描述voidsetState(string msg){m_msgmsg;}//得到鬼子犯下的罪行的相关信息stringgetState(){returnm_msg;}voidbeiDaddyDa(){cout脚盆鸡被兔子狠狠地揍了又揍, 终于承认了它们之前不承认的这些罪行: endl;}//将鬼子的罪行封装成一个历史对象并通过返回值传出History*saveHistory(){returnnewHistory(m_msg);}//从一个历史对象中读出相关的历史信息voidgetStateFromHistory(History*history){m_msghistory-getHistory();}private:string m_msg;};// 记录者classRecorder{public://添加历史信息并保存voidaddHistory(intindex,History*history){m_history.insert(make_pair(index,history));}//从备份信息中得到想要的历史信息History*getHistory(intindex){if(m_history.find(index)!m_history.end()){returnm_history[index];}returnnullptr;}private:mapint,History*m_history;};intmain(){vectorstringmsg{不承认偷了中国的中医!!!,不承认发动了侵华战争!!!,不承认南京大屠杀!!!!,不承认琉球群岛和钓鱼岛是中国的领土!!!,不承认731部队的细菌和人体试验!!!,不承认对我国妇女做出畜生行为!!!,不承认从中国掠夺的数以亿计的资源和数以万计的文物!!!,我干的龌龊事儿罄竹难书, 就是不承认......};JiaoPenJi*jiaopennewJiaoPenJi;Recorder*recordernewRecorder;// 把小日本的罪行记录下来for(inti0;imsg.size();i){jiaopen-setState(msg.at(i));recorder-addHistory(i,jiaopen-saveHistory());}jiaopen-beiDaddyDa();for(inti0;imsg.size();i){jiaopen-getStateFromHistory(recorder-getHistory(i));cout -- jiaopen-getState()endl;}return0;}特点⚠️备忘录模式在很多软件的使用过程中普遍存在但是在应用软件开发中它的使用频率并不太高因为现在很多基于窗体和浏览器的应用软件并没有提供撤销操作。主要优点它提供了一种状态恢复的实现机制使得用户可以方便地回到一个特定的历史步骤当新的状态无效或者存在问题时可以使用暂时存储起来的备忘录将状态复原。备忘录实现了对信息的封装一个备忘录对象是一种原发器对象状态的表示不会被其他代码所改动。备忘录保存了原发器的状态采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。资源消耗过大如果需要保存的原发器类的成员变量太多就不可避免需要占用大量的存储空间每保存一次对象的状态都需要消耗一定的系统资源。适用环境保存一个对象在某一个时刻的全部状态或部分状态这样以后需要时它能够恢复到先前的状态实现撤销操作。防止外界对象破坏一个对象历史状态的封装性避免将对象历史状态的实现细节暴露给外界对象。