//一个很好的CommandMode
//提炼一个Command接口
class Command
{
public:
virtual ~Command(){}
virtual void Execute() = 0;
protected:
Command(){}
};
class LightOnCommand : public Command
{
public:
void Execute()
{
//一般来说这里多是借助其它对象来完成,这个例子从简了
cout << "开始发光" << endl;
}
};
class LightOffCommand : public Command
{
public:
void Execute()
{
cout << "停止发光" << endl;
}
};
class FireOnCommand : public Command
{
public:
void Execute()
{
cout << "开始喷火" << endl;
}
};
class FireOffCommand : public Command
{
public:
void Execute()
{
cout << "结束喷火" << endl;
}
};
//公牛类
class Bulls
{
private:
//Command数组
vector<void*> m_Commands;
//void *m_Commands[4];
public:
Bulls()
{
m_Commands.push_back(new LightOnCommand());
m_Commands.push_back(new LightOffCommand());
m_Commands.push_back(new FireOnCommand());
m_Commands.push_back(new FireOffCommand());
}
//点击张开嘴
void ClickMouthOpen()
{
m_Commands[0]->Execute();
}
void ClickMouthClose()
{
m_Commands[1]->Execute();
}
void ClickEyeOpen()
{
m_Commands[2]->Execute();
}
void ClickEyeClose()
{
m_Commands[3]->Execute();
}
};
//提炼一个Command接口
class Command
{
public:
virtual ~Command(){}
virtual void Execute() = 0;
//撤消操作
virtual void UnExecute() = 0;
protected:
Command(){}
};
class LightOnCommand : public Command
{
public:
void Execute()
{
//一般来说这里多是借助其它对象来完成,这个例子从简了
cout << "开始发光" << endl;
}
void UnExecute()
{
cout << "撤销发光操作" << endl;
}
};
//公牛类
class Bulls
{
private:
vector m_Commands;
//添加一个堆栈作为撤消操作的容器
stack m_UndoCommands;
public:
Bulls()
{
m_Commands.push_back(new LightOnCommand());
m_Commands.push_back(new LightOffCommand());
m_Commands.push_back(new FireOnCommand());
m_Commands.push_back(new FireOffCommand());
}
void ClickMouthOpen()
{
m_Commands[0]->Execute();
//每次操作后,把该操作放入堆栈中
m_UndoCommands.push(m_Commands[0]);
}
void ClickMouthClose()
{
m_Commands[1]->Execute();
m_UndoCommands.push(m_Commands[1]);
}
void ClickEyeOpen()
{
m_Commands[2]->Execute();
m_UndoCommands.push(m_Commands[2]);
}
void ClickEyeClose()
{
m_Commands[3]->Execute();
m_UndoCommands.push(m_Commands[3]);
}
void Undo()
{
//撤消通过调用m_UndoCommands来完成
if ( !m_UndoCommands.empty())
{
m_UndoCommands.top()->UnExecute();
m_UndoCommands.pop();
}
}
};