设计模式之命令模式

`#include
using namespace std;
class Command{
public:
Command();
virtual void on(){};
virtual void off(){};
virtual void undo(){};
};
Command::Command(){};
class BaseOBJ
{
public:
BaseOBJ();
virtual void on(){};
virtual void off(){};
};
BaseOBJ::BaseOBJ(){}
//女招待
class OnCommand : public Command
{
public:
OnCommand(BaseOBJ light){
m_light = light;
}
void on(){
m_light->on();
}
void undo(){
m_light->off();
}
BaseOBJ
m_light;
};
//这里开关个是一个类,可能开关是个复杂的过程,内部还有其他的函数,在实际中可以根据实际来决定
//是一个类还是一个函数
class OffCommand : public Command
{
public:
OffCommand(BaseOBJ light){
m_light = light;
}
void off(){
m_light->off();
}
void undo(){
m_light->on();
}
BaseOBJ
m_light;
};
//卡槽
class SimpleRemoteControl {
public:
void setonCommand(Command command,int index){
m_oncommand[index] = command;
}
void buttonWasOnPressed(int index){
m_oncommand[index]->on();
m_undocommand = m_oncommand[index];
}
void setoffCommand(Command command,int index){
m_offcommand[index] = command;
}
void buttonWasOffPressed(int index){
m_offcommand[index]->off();
m_undocommand = m_offcommand[index];
}
//这个撤销按钮是根据上一个按钮的状态来决定该状态的撤销的动作是什么
//而不是来依次记录,所以由各个子类自己去记录状态,并决定在谋状态下的撤销动作
void undo(){
m_undocommand->undo();
}
Command
m_oncommand[7];
Command
m_offcommand[7];
Command* m_undocommand;
};
class Light:public BaseOBJ{
public:
void on(){
cout<<"light on"<<endl;
}
void off(){
cout<<"light off"<<endl;
}
};
class Light1:public BaseOBJ{
public:
void on(){
cout<<"light1 on"<<endl;
}
void off(){
cout<<"light1 off"<<endl;
}
};
class Light2:public BaseOBJ{
public:
void on(){
cout<<"light2 on"<<endl;
}
void off(){
cout<<"light2 off"<<endl;
}
};
int main()
{
SimpleRemoteControl control = new SimpleRemoteControl();
Command
commandptr= new OnCommand(new Light());
Command* commandptr1= new OnCommand(new Light1());
Command* commandptr2= new OnCommand(new Light2());
control->setonCommand(commandptr,0);
control->setonCommand(commandptr1,1);
control->setonCommand(commandptr2,2);
control->setoffCommand(new OffCommand(new Light()),0);
control->setoffCommand(new OffCommand(new Light1()),1);
control->setoffCommand(new OffCommand(new Light2()),2);
control->buttonWasOffPressed(0);
control->buttonWasOffPressed(1);
control->undo();
control->buttonWasOffPressed(2);
control->buttonWasOnPressed(0);
control->buttonWasOnPressed(1);
control->buttonWasOnPressed(2);
return 0;
}

posted @ 2024-09-08 12:39  你看起来丿很好吃  阅读(15)  评论(0)    收藏  举报