命令模式

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

转载于:https://www.cnblogs.com/foolbread/p/4462632.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值