又叫快照模式。

捕获一个对象的内部状态,以便可以在需要时还原这个对象的状态。

应用场景

场景1:需要 undo 操作时,可以在执行操作之前先备份状态,一旦失败则恢复到操作前的状态。

例1

#include "PublicHeaders.h"
                #pragma  once
                
                #include <string>
                
                
                
                class Memento
                {
                public:
                	Memento(const std::string & state)
                	{
                		this->state = state;
                	}
                	void setState(const std::string& state)
                	{
                		this->state = state;
                	}
                
                	const std::string getState()const
                	{
                		return state;
                	}
                private:
                
                	std::string state;
                };
                
                
                
                
                class Originator
                {
                public:
                	Memento* CreateMemento()
                	{
                		if (backup)
                		{
                			delete backup;
                		}
                		backup = new Memento(state);
                		return backup;
                	}
                
                	void RestoreMemento()
                	{
                		this->state = backup->getState();
                	}
                
                
                	void RestoreMemento(Memento*mem)
                	{
                		this->state = mem->getState();
                	}
                
                
                	const std::string &getState()const
                	{
                		return state;
                	}
                	void setState(const std::string& state)
                	{
                		this->state = state;
                	}
                
                	void PrintState()
                	{
                		std::cout << state << std::endl;
                
                	}
                
                private:
                	Memento *backup = nullptr;
                
                	std::string state = "";
                };
                
                
                void testMemento()
                {
                	Originator * ori = new Originator;
                	ori->setState("old");
                	ori->PrintState();
                	ori->CreateMemento();
                
                
                	ori->setState("new");
                	ori->PrintState();
                	ori->RestoreMemento();
                	ori->PrintState();
                
                }

例2

SGZ 游戏项目中,网络连接失败后恢复操作前的状态。

-- [Comment]
                -- callErrorCallback copy  recovery
                -- 这3个函数是撤销更改
                local function callErrorCallback()
                    t:recovery()
                end
                
                local _copy = 0
                
                function t:copy()
                    _copy = clone(t)
                end
                
                function t:recovery()
                    if _copy ~= 0 then
                
                        t = _copy
                    end
                end
                
                
                
                -- 本地数据转换为json ,便于上传服务器
                function t:toJson()
                end
                
                
                -- [Comment]
                -- 从json设置 数据 便于服务器下载后,处理
                function t:setJson(m_json)
                    if arg == "" then
                        return
                    end
                end
                
                
                -- [Comment]
                -- 玩家执行了敏感操作,才会执行,客户端本地缓存
                -- @private
                t.need_upload = false  -- 需要上传数据到服务器
                t.need_download = true -- 需要下载数据到客户端
                
                。。。。。。。。。。。。