代码改变世界

命令模式

2015-04-28 11:58  foolbread-老陈  阅读(113)  评论(0编辑  收藏  举报

  命令模式:将请求封装成对象,这可以让你使用不同的请求,队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。——《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();
}
     个人感悟:待留。