1.首先建立命令虚基类
.h
//基类虚函数
class Command
{
public:
Command(void){};
virtual ~Command(void){};
public:
virtual void Redo() = 0;
virtual void Undo() = 0;
};
2.创建管理命令的类
.h
#include "Command.h"
#include "vector"
using namespace std;
//命令管理类
class CommandManager
{
public:
CommandManager(void);
virtual~CommandManager(void);
public:
virtual void StoreCommand(Command *cmd);
virtual void ClearAllCommand();
virtual void ClearRedoCommand();
virtual void Undo() = 0;
virtual void Redo() = 0;
virtual void ReleaseAllCmd();
public:
vector<Command*> m_vecRedo;
vector<Command*> m_vecUndo;
};
.cpp
#include "stdafx.h"
#include "CommandManager.h"
CommandManager::CommandManager(void)
{
}
CommandManager::~CommandManager(void)
{
}
void CommandManager::StoreCommand(Command *cmd)
{
m_vecUndo.push_back(cmd);
ClearRedoCommand(); //添加信命令时,清除重做命令
}
void CommandManager::ClearAllCommand()
{
ClearRedoCommand();
for (int i = 0; i < (int)m_vecUndo.size(); ++i)
{
if (NULL != m_vecUndo[i])
{
delete m_vecUndo[i];
m_vecUndo[i] = NULL;
}
}
m_vecUndo.clear();
}
void CommandManager::ClearRedoCommand()
{
for (int i = 0; i < (int)m_vecRedo.size(); ++i)
{
if (NULL != m_vecRedo[i])
{
delete m_vecRedo[i];
m_vecRedo[i] = NULL;
}
}
m_vecRedo.clear();
}
void CommandManager::ReleaseAllCmd()
{
for (int i = 0; i < (int)m_vecRedo.size(); ++i)
{
if (NULL != m_vecRedo[i])
{
delete m_vecRedo[i];
m_vecRedo[i] = NULL;
}
}
m_vecRedo.clear();
for (int i = 0; i < (int)m_vecUndo.size(); ++i)
{
if (NULL != m_vecUndo[i])
{
delete m_vecUndo[i];
m_vecUndo[i] = NULL;
}
}
m_vecUndo.clear();
}
3.创建保存命令基类
.h
#include "CommandManager.h"
class CmdHistoryManager :public CommandManager
{
public:
CmdHistoryManager(void);
virtual ~CmdHistoryManager(void);
public:
static CmdHistoryManager *getInstance()
{
if (NULL == m_pCmdHistoryManager)
{
m_pCmdHistoryManager = new CmdHistoryManager();
}
return m_pCmdHistoryManager;
}
static void ReleaseInstacne();
virtual void Undo();
virtual void Redo();
private:
static CmdHistoryManager *m_pCmdHistoryManager;
};
.cpp
#include "stdafx.h"
#include "CmdHistoryManager.h"
CmdHistoryManager * CmdHistoryManager::m_pCmdHistoryManager = NULL;
CmdHistoryManager::CmdHistoryManager(void)
{
}
CmdHistoryManager::~CmdHistoryManager(void)
{
}
void CmdHistoryManager::Undo()
{
if (m_vecUndo.empty())
{
return;
}
Command *cmd = m_vecUndo.at(m_vecUndo.size() - 1);
cmd->Undo();
m_vecUndo.pop_back();
m_vecRedo.push_back(cmd);
}
void CmdHistoryManager::Redo()
{
if (m_vecRedo.empty())
{
return;
}
Command *cmd = m_vecRedo.at(m_vecRedo.size() - 1);
cmd->Redo();
m_vecRedo.pop_back();
m_vecUndo.push_back(cmd);
}
void CmdHistoryManager::ReleaseInstacne()
{
if (NULL != m_pCmdHistoryManager)
{
delete m_pCmdHistoryManager;
m_pCmdHistoryManager = NULL;
}
}
基本类创建完毕;
下面就需要创建实际的命令基类 例如:CMyCmd类
#include "Command.h"
class CMyCmd: public Command
{
public:
CMyCmd();
//添加所需的构造函数
CMyCmd(int nMovePosBefore, int nMovePosAfter);
~CTimeAnalyCmd();
public:
virtual void Redo();
virtual void Undo();
public:
void MovePos(int nPos);
private:
//保存变量
int m_nMovePosBefore;
int m_nMovePosAfter;
};
#include "MyCmd.h"
CMyCmd::CMyCmd()
{
}
CMyCmd:: CMyCmd(int nMovePosBefore, int nMovePosAfter)
{
m_nMovePosBefore = nMovePosBefore;
m_nMovePosAfter = nMovePosAfter;
}
CMyCmd::~CMyCmd()
{
}
void CMyCmd::Redo()
{
MovePos(m_nMovePosAfter);
}
void CMyCmd::Undo()
{
MovePos(m_nMovePosBefore);
}
void CMyCmd::MovePos(int nPos)
{
\\移动操作
}
创建类对象
CMyCmd* pCmd = new CMyCmd();
将创建好的类对象保存到管理命令的类中
CmdHistoryManager::getInstance()->StoreCommand(pCmd);
撤销操作
CmdHistoryManager::getInstance()->Undo();
恢复操作
CmdHistoryManager::getInstance()->Redo();
注意释放:
CmdHistoryManager::getInstance()->ReleaseAllCmd();
CmdHistoryManager::getInstance()->ReleaseInstacne();