// test06.cpp : Defines the entry point for the console application.
//
//设计模式第5章 命令模式
#include "stdafx.h"
#include <string>
#include <iostream>

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

class Light
{
    string position;
public:
    Light(string strPos)
    {
        position = strPos;
    }
public:
    void on()
    {
        cout<<position<<"Light is on"<<endl;
    }

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

class CeilingFan
{
    string position;
public:
    CeilingFan(string strPos)
    {
        position = strPos;
    }
public:
    void high()
    {
        cout<<position<<"ceiling fan is on high"<<endl;
    }

void medium()
    {
        cout<<position<<"ceiling fan is on medium"<<endl;
    }
    void off()
    {
        cout<<position<<"ceiling fan is off"<<endl;
    }
};

class GarageDoor
{
    string position;
public:
    GarageDoor(string strPos)
    {
        position = strPos;
    }
public:
    void up()
    {
        cout<<position<<"garage door is up"<<endl;
    }

void down()
    {
        cout<<position<<"garage door is down"<<endl;
    }
};

class Stereo
{
    string position;
public:
    Stereo(string strPos)
    {
        position = strPos;
    }

public:
    void on()
    {
        cout<<position<<"stereo is on"<<endl;
    }

void off()
    {
        cout<<position<<"stereo is off"<<endl;
    }

void setCD()
    {
        cout<<position<<"stereo is set for CD"<<endl;
    }

void setVolume(int volume)
    {
        cout<<position<<"stereo volume set to "<<volume<<endl;
    }
};

class LightOnCommand : public Command
{
    Light* light;
public:
    LightOnCommand(Light* light)
    {
        this->light = light;
    }
    void execute()
    {
        light->on();
    }
};

class LightOffCommand:public Command
{
    Light* light;
public:
    LightOffCommand(Light* light)
    {
        this->light = light;
    }

void execute()
    {
        light->off();
    }
};

class CeilingFanOnCommand:public Command
{
    CeilingFan* ceilingfan;
public:
    CeilingFanOnCommand(CeilingFan* pCeilingFan)
    {
        ceilingfan = pCeilingFan;
    }

void execute()
    {
        ceilingfan->high();
    }
};

class CeilingFanOffCommand:public Command
{
    CeilingFan* ceilingfan;
public:
    CeilingFanOffCommand(CeilingFan* pCeilingFan)
    {
        ceilingfan = pCeilingFan;
    }

void execute()
    {
        ceilingfan->off();
    }
};

class GarageDoorUpCommand:public Command
{
    GarageDoor* garagedoor;
public:
    GarageDoorUpCommand(GarageDoor* pGaragedoor)
    {
        garagedoor = pGaragedoor;
    }

void execute()
    {
        garagedoor->up();
    }
};

class GarageDoorDownCommand:public Command
{
    GarageDoor* garagedoor;
public:
    GarageDoorDownCommand(GarageDoor* pGaragedoor)
    {
        garagedoor = pGaragedoor;
    }

void execute()
    {
        garagedoor->down();
    }
};

class StereoOnWithCDCommand:public Command
{
    Stereo* stereo;

public:
    StereoOnWithCDCommand(Stereo* pStereo)
    {
        stereo = pStereo;
    }

void execute()
    {
        stereo->on();
        stereo->setCD();
        stereo->setVolume(11);
    }
};

class StereoOffCommand:public Command
{
    Stereo* stereo;

public:
    StereoOffCommand(Stereo* pStereo)
    {
        stereo = pStereo;
    }

void execute()
    {
        stereo->off();
    }
};

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

class RemoteControl
{
    Command** onCommands;
    Command** offCommands;

public:
    RemoteControl()
    {
        onCommands = new Command* [7];
        offCommands = new Command* [7];

Command* noCommand = new NoCommand();
        for(int i = 0; i< 7; i++)
        {
            onCommands[i] = noCommand;
            offCommands[i] = noCommand;
        }
    }

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

void onButtonWasPushed(int slot)
    {
        onCommands[slot]->execute();
    }

void offButtonWasPushed(int slot)
    {
        offCommands[slot]->execute();
    }

};
int _tmain(int argc, _TCHAR* argv[])
{
    RemoteControl remoteControl;

Light livingroomLight("Living Room");
    Light kitchenLight("Kitchen");
    CeilingFan ceilingfan("Livint Room");
    GarageDoor garadoor("");
    Stereo stereo("Livint Room");

LightOnCommand* livingroomLightOn = new LightOnCommand(&livingroomLight);
    LightOffCommand* livintroomLightOff = new LightOffCommand(&livingroomLight);
    LightOnCommand* kitchenLightOn = new LightOnCommand(&kitchenLight);
    LightOffCommand* kitchenLightOff = new LightOffCommand(&kitchenLight);

CeilingFanOnCommand* ceilingFanOn = new CeilingFanOnCommand(&ceilingfan);
    CeilingFanOffCommand* ceilingFanOff = new CeilingFanOffCommand(&ceilingfan);

GarageDoorUpCommand* garageDoorUp = new GarageDoorUpCommand(&garadoor);
    GarageDoorDownCommand* garageDoorDown = new GarageDoorDownCommand(&garadoor);

StereoOnWithCDCommand* stereoOnWithCD = new StereoOnWithCDCommand(&stereo);
    StereoOffCommand* stereoOff = new StereoOffCommand(&stereo);

remoteControl.setCommand(0,livingroomLightOn,livintroomLightOff);
    remoteControl.setCommand(1,kitchenLightOn,kitchenLightOff);
    remoteControl.setCommand(2,ceilingFanOn,ceilingFanOff);
    remoteControl.setCommand(3,stereoOnWithCD,stereoOff);

remoteControl.onButtonWasPushed(0);
    remoteControl.offButtonWasPushed(0);
    remoteControl.onButtonWasPushed(1);
    remoteControl.offButtonWasPushed(1);
    remoteControl.onButtonWasPushed(2);
    remoteControl.offButtonWasPushed(2);
    remoteControl.onButtonWasPushed(3);
    remoteControl.offButtonWasPushed(3);
    return 0;
}

最新文章

  1. Matlab绘图函数一览
  2. ajax访问 aspx.cs后台
  3. Linux命令行--使用linux环境变量(转)
  4. how to extract and decrypt WeChat EnMicromsg.db on Android phone
  5. Redis操作命令
  6. 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)
  7. Terrocotta - 基于JVM的Java应用集群解决方案
  8. 写一个TT模板自动生成spring.net下面的配置文件。
  9. win7电脑自动关机怎么设置
  10. 每天一个JS 小demo之个人信息添加。主要知识点:DOM操作中的表格操作,节点操作
  11. ASP.NET Core教程【二】从保存数据看特有属性与服务端验证
  12. Java注解原理
  13. jquery 入口函数
  14. Vue:Vue2.0搭建脚手架
  15. 1. SpringBoot启动后,报异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
  16. SQL Server 2008 附加数据库之后显示为 只读 的解决方法
  17. LK光流算法的三个假设
  18. Pig脚本 .pig
  19. jQuery 滑动选项卡jQuery tabslet
  20. .Net core使用Quartz.Net 实现定时任务

热门文章

  1. Oracle TNS Listener Remote Poisoning
  2. [Flex] 组件Tree系列 —— 利用firstVisibleItem属性,设置或取得第一个显示节点
  3. 简易 PHP 教程小记
  4. 搭建sftp并设置不同权限的多个用户
  5. 关于在iOS应用中跳转到AppStore
  6. 几个常见用于解决nginx负载均衡的session共享问题的办法
  7. 01. css sprite是什么,有什么优缺点?
  8. java.math.BigDecimal cannot be cast to java.lang.Integer
  9. poi 导出工具类
  10. 那些H5用到的技术(1)——素材加载