class IOpt
{
public:
virtual void Undo() = 0; //撤销
virtual void Redo() = 0; //重做
}
class CDelOpt:public IOpt
{
public:
void Undo(); //撤销, 把图形重新放回链表
void Redo(); //重做, 把图形从链表删除
private:
IShape* m_pDelShape;
int m_nPos;
CList<IShape*>* m_pLstShapes;
}
class CRotateOpt:public IOpt
{
public:
void Undo(); //撤销, 还原原来的坐标点
void Redo(); //重做, 改成旋转后的坐标点
private:
IShape* m_pDelShape;
CPoint m_ptBenginOld;
CPoint m_ptEndOld;
CPoint m_ptBenginNew;
CPoint m_ptEndNew;
}
数据结构
操作 栈 栈
增加图形1 增加图形1
增加图形2 增加图形1 增加图形2
移动图形1 增加图形1 增加图形2 移动图形1
删除图形2 增加图形1 增加图形2 移动图形1 删除图形2
撤销 增加图形1 增加图形2 移动图形1 删除图形2
撤销 增加图形1 增加图形2 删除图形2 移动图形1
撤销 增加图形1 删除图形2 移动图形1 增加图形2
重做 增加图形1 增加图形2 删除图形2 移动图形1
重做 增加图形1 增加图形2 移动图形1 删除图形2
撤销 增加图形1 增加图形2 删除图形2 移动图形1
class ICommand
{
public:
virtual void UnExcute() = 0; //撤销,反执行
virtual void Excute() = 0; //重做,执行
}