设计模式(C++)-行为型模式-备忘录模式
设计模式(C)-行为型模式-备忘录模式一、备忘录模式概述备忘录模式是一种行为型模式允许在不破坏封装性的前提下捕获并保存一个对象的内部状态以便以后可以恢复到这个状态。核心思想三个关键角色1.Originator原发器需要保存状态的对象2.Memento备忘录存储Originator内部状态的对象3.Caretaker负责人负责保存和恢复备忘录但不操作备忘录内容二、备忘录模式UML类图备忘录场景备忘录模式的典型应用场景包括:撤销操作在编辑器中用户可能希望撤销最近的几次操作。游戏存档在游戏过程中玩家可能希望保存当前进度以便之后可以继续游戏。事务处理在数据库事务中如果事务失败需要恢复到事务之前的状态。三、代码实现//memento.h#pragmaonce/* 备忘录模式Memento Pattern 是一种软件设计模式属于行为型模式。 它主要用于保存一个对象的某个状态以便在需要时可以恢复到这个状态。 备忘录模式通常用于实现撤销功能或者在某些情况下实现对象的快照功能。 备忘录模式涉及三个角色 Originator发起人创建一个备忘录Memento用以记录当前时刻的内部状态并可以使用Memento恢复内部状态。 Memento备忘录负责存储Originator的内部状态并可以防止外部直接修改这个状态。 Caretaker管理者负责保存好Memento不能对Memento的内容进行操作或检查只能进行保存或丢弃。 备忘录模式的典型应用场景包括: 撤销操作在编辑器中用户可能希望撤销最近的几次操作。 游戏存档在游戏过程中玩家可能希望保存当前进度以便之后可以继续游戏。 事务处理在数据库事务中如果事务失败需要恢复到事务之前的状态。 */#includevector#includememory#includeiostreamclassMemento;//发起人 类负责创建备忘录并根据备忘录恢复状态class{public:Originator(intstate):state_(state){}//创建备忘录std::shared_ptrMementosaveStateToMemento();//恢复状态voidgetStateFromMemento(std::shared_ptrMementomemento);//打印当前状态voidprintState();//用于改变状态的方法voidsetState(intnewState);//获取当前状态intgetState()const;private:intstate_;};//备忘录类负责存储发起人的内部状态classMemento{public:explicitMemento(intstate):state_(state){}intgetState();private:intstate_;};//管理者类负责保存备忘录classCaretaker{public://保存备忘录voidadd(std::shared_ptrMementomemonto);//根据索引获取备忘录std::shared_ptrMementoget(intindex);private:std::vectorstd::shared_ptrMementomementoList_;};voidtestMemento();//memento.cc#includememento.hstd::shared_ptrMementoOriginator::saveStateToMemento(){returnstd::make_sharedMemento(state_);}voidOriginator::getStateFromMemento(std::shared_ptrMementomemento){state_memento-getState();}voidOriginator::printState(){std::coutCurrent state: state_std::endl;}voidOriginator::setState(intnewState){state_newState;}intOriginator::getState()const{returnstate_;}intMemento::getState(){returnstate_;}voidCaretaker::add(std::shared_ptrMementomemonto){mementoList_.push_back(memonto);}std::shared_ptrMementoCaretaker::get(intindex){returnmementoList_.at(index);}voidtestMemento(){std::coutmemento startstd::endl;//创建发起人对象初始状态为10Originator*originatornewOriginator(10);Caretaker caretaker;//创建管理者对象//保存状态originator-printState();caretaker.add(originator-saveStateToMemento());//改变状态originator-setState(20);originator-printState();//恢复状态originator-getStateFromMemento(caretaker.get(0));originator-printState();//释放发起人对象deleteoriginator;originatornullptr;std::coutmemento endstd::endl;}四、优缺点总结优点封装性好不暴露对象内部状态可恢复性支持状态回滚简化原发器状态保存逻辑分离支持撤销/重做适合实现编辑器功能缺点内存消耗大量备忘录可能占用过多内存性能考虑状态序列化/反序列化开销深拷贝问题复杂对象的深度复制线程安全多线程环境下的状态管理
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595269.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!