标签:
命令模式:将请求封装成对象,这可以让你使用不同的请求,队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。——《HEAD FIRST 设计模式》
我的c++代码:
#ifndef DESIGN_COMMAND_H_ #define DESIGN_COMMAND_H_ #define SLOTSNUMS 7 class Command { public: virtual void execute() = 0; }; class RemoteControl { public: void setCommand(int slot, Command* on, Command* off); void onButtonWasPushed(int slot); void offButtonWasPushed(int slot); private: Command* onCommands[SLOTSNUMS]; Command* offCommands[SLOTSNUMS]; }; /////////////////////////////////////////// class Light { public: void on(); void off(); }; class Stereo { public: void on(); void off(); void setCd(); void setDvd(); void setRadio(); void setVolume(); }; class Garagedoor { public: void up(); void down(); void stop(); void lightOn(); void lightOff(); }; /////////////////////////////////////////// class LightOnCommand : public Command { public: LightOnCommand(Light* l); public: virtual void execute(); private: Light* m_light; }; class LightOffCommand : public Command { public: LightOffCommand(Light* l); public: virtual void execute(); private: Light* m_light; }; class StereoOnWithCDCommand : public Command { public: StereoOnWithCDCommand(Stereo* s); public: virtual void execute(); private: Stereo* m_stereo; }; class StereoOffCommand : public Command { public: StereoOffCommand(Stereo* s); public: virtual void execute(); private: Stereo* m_stereo; }; class GarageDoorDownCommand : public Command { public: GarageDoorDownCommand(Garagedoor* g); public: virtual void execute(); private: Garagedoor* m_garage; }; class GarageDoorUpCommand : public Command { public: GarageDoorUpCommand(Garagedoor* g); public: virtual void execute(); private: Garagedoor* m_garage; }; #endif // DESIGN_COMMAND_H_
#include "command.h" #include <iostream> void RemoteControl::setCommand(int slot, Command* on, Command* off) { this->onCommands[slot] = on; this->offCommands[slot] = off; } void RemoteControl::onButtonWasPushed(int slot) { this->onCommands[slot]->execute(); } void RemoteControl::offButtonWasPushed(int slot) { this->offCommands[slot]->execute(); } void Light::on() { std::cout << "light is on!" << std::endl; } void Light::off() { std::cout << "light is off!" << std::endl; } void Stereo::on() { std::cout << "stereo is on!" << std::endl; } void Stereo::off() { std::cout << "stereo is off!" << std::endl; } void Stereo::setCd() { std::cout << "stereo set cd!" << std::endl; } void Stereo::setDvd() { std::cout << "stereo set dvd!" << std::endl; } void Stereo::setRadio() { std::cout << "stereo set radio!" << std::endl; } void Stereo::setVolume() { std::cout << "stereo set volume!" << std::endl; } void Garagedoor::up() { std::cout << "garagedoor up!" << std::endl; } void Garagedoor::down() { std::cout << "garagedoor down!" << std::endl; } void Garagedoor::stop() { std::cout << "garagedoor stop!" << std::endl; } void Garagedoor::lightOn() { std::cout << "garagedoor light on!" << std::endl; } void Garagedoor::lightOff() { std::cout << "garagedoor light off!" << std::endl; } LightOnCommand::LightOnCommand(Light* l) { this->m_light = l; } void LightOnCommand::execute() { this->m_light->on(); } LightOffCommand::LightOffCommand(Light* l) { this->m_light = l; } void LightOffCommand::execute() { this->m_light->off(); } StereoOnWithCDCommand::StereoOnWithCDCommand(Stereo* s) { this->m_stereo = s; } void StereoOnWithCDCommand::execute() { this->m_stereo->on(); this->m_stereo->setCd(); this->m_stereo->setVolume(); } StereoOffCommand::StereoOffCommand(Stereo* s) { this->m_stereo = s; } void StereoOffCommand::execute() { this->m_stereo->off(); } GarageDoorDownCommand::GarageDoorDownCommand(Garagedoor* g) { this->m_garage = g; } void GarageDoorDownCommand::execute() { this->m_garage->down(); } GarageDoorUpCommand::GarageDoorUpCommand(Garagedoor* g) { this->m_garage = g; } void GarageDoorUpCommand::execute() { this->m_garage->up(); }
标签:
原文地址:http://www.cnblogs.com/foolbread/p/4462632.html