某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式的类图如图5-1所示。

【C++代码】
class Light{
public:
Light(string name){/*代码省略*/}
void on( ){/*代码省略*/}//开灯
void off( ){/*代码省略*/}//关灯
};
class Command{
public:
(1);
};
class LightOnCommand:public Command{//开灯命令
private:
Light*light;
public:
LightOnCommand(Light*light){this->light=light;}
void execute( ){(2);}
};
class LightOffCommand:public Command{//关灯命令
private:
Light*light;
public:
LightOffCommand(Light*light){this->light=light;}
void execute( ){(3);}
};
class RemoteControl{//遥控器
private:
Command*onCommands[7];
Command*offCommands[7];
public:
RemoteControl( ){/*代码省略*/}
void setCommand(int slot,Command*onCommand,Command*offCommand){
(4)=onCommand;
(5)=offCommand;
}
void onButtonWasPushed(int slot){(6);}
void offButtonWasPushed(int slot){(7);}
};
int main( ){
RemoteControl*remoteControl=new RemoteControl( );
Light*livingRoomLight=new Light("Living Room");
Light*kitchenLight=new Light("kitchen");
LightOnCommand*livingRoomLightOn=new LightOnCommand(livingRoomLight);
LightOffCommand*livingRoomLightOff=newLightOffCommand(livingRoomLight);
LightOnCommand*kitchenLightOn=new LightOnCommand(kitchenLight);
LightOffCommand*kitchenLightOff=new LightOffCommand(kitchenLight);
remoteControl->setCommand(0,livingRoomLightOn,livingRoomLightOff);
remoteControl->setCommand(1,kitchenLightOn,kitchenLightOff);
remoteControl->onButtonWasPushed(0);
remoteControl->offButtonWasPushed(0);
remoteControl->onButtonWasPushed(1);
remoteControl->offButtonWasPushed(1);
/*其余代码省略*/
return 0;
}
正确答案及解析
正确答案
解析
(1)virtual void execute()=0
(2)light->on()
(3)light->off()
(4)onCommands[slot]
(5)offCommands[slot]
(6)onCommands[slot]->execute()
(7)offCommands[slot]->execute()
本题考查设计模式的实现,难度较小。根据类图和已有代码可写出空缺的代码,书写方式注意java和C++的区别即可。
Command类为所有的命令声明了一个接口,因此需要一个纯虚函数,这个函数根据下面的子类可以看到,应该为execute(),因此第一空填写virtual void execute()=0;
(2)和(3)定义了开灯、关灯action,因此,分别填写(2)light->on()(3)light->off();
(4)(5)分别设置“开灯”命令对象、“关灯”命令对象,因此分别填写(4)onCommands[slot](5)offCommands[slot];
(6)(7)分别完成对开灯、关灯命令对象的execute方法的调用,因此分别填写(6)onCommands[slot]->execute()
(7)offCommands[slot]->execute()。





