您的位置:首页 > 编程语言 > C语言/C++

设计模式--命令模式 C++实现

2014-04-23 17:22 651 查看

Head First 教材 ch6

#include<iostream>
#include<string>
using namespace std;
#define num 2

class Light{
public:
Light(string s);
void on();
void off();
protected:
string concretelight;
};

class Stereo
{
public:
Stereo(string s);
void on();
void off();
void setCd();
void setDvd();
void setRadio();
void setVolum(int i);
private:
string constereo;
};

class Command{
public:
virtual void execute(){};
};

class noCommand:public Command
{
public:
void execute(){};
};

class LightOnCommand:public Command{
public:
LightOnCommand(Light &light);
void execute();
private:
Light *plighton;
};

class LightOffCommand:public Command{
public:
LightOffCommand(Light &light);
void execute();
private:
Light *plightoff;
};

class StereoOnWithCDCommand:public Command
{
public:
StereoOnWithCDCommand(Stereo &stereo);
void execute();
private:
Stereo *pstereo;
};

class StereoOffCommand:public Command
{
public:
StereoOffCommand(Stereo &stereo);
void execute();
private:
Stereo *pstereooff;
};

class RemoteControl
{
public:
RemoteControl();
void setCommand(int slot,Command &onCommand,Command &offCommand);
void onButtonWasPressed(int slot);
void offButtonWasPressed(int slot);
void freememory();
private:
Command *onCommands[num];
Command *offCommands[num];
};

Light::Light(string s)
{
concretelight=s;
}

void Light::on(){
cout<<concretelight<<"light is on"<<endl;
}

void Light::off(){
cout<<concretelight<<"Light is off"<<endl;
}

LightOnCommand::LightOnCommand(Light &light){
plighton=&light;
}

void LightOnCommand::execute(){
plighton->on();
}

LightOffCommand::LightOffCommand(Light &light){
plightoff=&light;
}

void LightOffCommand::execute(){
plightoff->off();
}

Stereo::Stereo(string s)
{
constereo=s;
}

void Stereo::on()
{
cout<<constereo<<" Stereo is on"<<endl;
}

void Stereo::off()
{
cout<<constereo<<" Stereo is off"<<endl;
}

void Stereo::setCd()
{
cout<<constereo<<" stereo is set for CD input"<<endl;
}

void Stereo::setDvd()
{
cout<<constereo<<" stereo is set for DVD input"<<endl;
}

void Stereo::setRadio()
{
cout<<constereo<<" stereo is ready for setradio"<<endl;
}

void Stereo::setVolum(int i)
{
cout<<constereo<<" stereo volume set to "<<i<<endl;
}

StereoOnWithCDCommand::StereoOnWithCDCommand(Stereo &stereo)
{
pstereo=&stereo;
}

void StereoOnWithCDCommand::execute()
{
pstereo->on();
pstereo->setCd();
pstereo->setVolum(11);
}

StereoOffCommand::StereoOffCommand(Stereo &stereo)
{
pstereooff=&stereo;
}

void StereoOffCommand::execute()
{
pstereooff->off();
}

RemoteControl::RemoteControl()
{
noCommand nocommand;
for(int i=0;i<num;i++)
{
onCommands[i]=new Command();
offCommands[i]=new Command();
}
for(int i=0;i<num;i++)
{
onCommands[i]=&nocommand;
offCommands[i]=&nocommand;
}
}

void RemoteControl::setCommand(int slot,Command &onCommand,Command &offCommand)
{
onCommands[slot]=&onCommand;
offCommands[slot]=&offCommand;
}

void RemoteControl::onButtonWasPressed(int slot)
{
onCommands[slot]->execute();
}

void RemoteControl::offButtonWasPressed(int slot)
{
offCommands[slot]->execute();
}

void RemoteControl::freememory()
{
delete[] onCommands;
delete[] offCommands;
}

int main(){
Light light("Kitchen");
RemoteControl remotecontrol;
LightOnCommand lighton=LightOnCommand(light);
LightOffCommand lightoff=LightOffCommand(light);

Stereo stereo("Living Room");
StereoOnWithCDCommand stereoOnWithCD(stereo);
StereoOffCommand stereoOff(stereo);

remotecontrol.setCommand(0,lighton,lightoff);
remotecontrol.setCommand(1,stereoOnWithCD,stereoOff);

remotecontrol.onButtonWasPressed(0);
remotecontrol.offButtonWasPressed(0);
remotecontrol.onButtonWasPressed(1);
remotecontrol.offButtonWasPressed(1);
remotecontrol.freememory();

return 0;
}

命令的发出者与命令的执行者完全解耦

为指针数组分配内存不要忘记释放.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: