:命令模式:Command
#ifndef __COMMAND_H__
#define __COMMAND_H__
#include <vector>
#include "Equipment.h" class Command
{
public:
Command(){}
virtual ~Command(){}
virtual void Execute(){}
virtual void Undo(){}
}; class NoCommand :public Command
{
public:
NoCommand(){}
virtual ~NoCommand(){}
virtual void Execute()
{
print("No Command Execute");
}
virtual void Undo()
{
print("No Command Undo");
}
}; class LightOnCommand : public Command
{
private:
Light *light;
public:
LightOnCommand(Light *l)
{
light = l;
}
virtual ~LightOnCommand(){}
virtual void Execute()
{
light->On();
}
virtual void Undo()
{
light->Off();
}
}; class LightOffCommand : public Command
{
private:
Light *light;
public:
LightOffCommand(Light *l)
{
light = l;
}
virtual ~LightOffCommand(){}
virtual void Execute()
{
light->Off();
}
virtual void Undo()
{
light->On();
}
}; class GarageDoorUpCommand : public Command
{
private:
GarageDoor *door;
public:
GarageDoorUpCommand(GarageDoor *d)
{
door = d;
}
virtual ~GarageDoorUpCommand(){}
virtual void Execute(){door->up();}
virtual void Undo(){ door->down(); }
}; class GarageDoorDownCommand : public Command
{
private:
GarageDoor *door;
public:
GarageDoorDownCommand(GarageDoor *d){ door = d;}
virtual ~GarageDoorDownCommand(){}
virtual void Execute(){ door->down(); }
virtual void Undo(){ door->up(); }
}; class PartyBeginCommand : public Command
{
private:
vector<Command *>commands;
public:
PartyBeginCommand(vector<Command *> cmd)
{
commands.swap(cmd);
} virtual void Execute()
{
for (size_t i = 0; i < commands.size(); i++)
{
commands[i]->Execute();
}
} virtual void Undo()
{
for (size_t i = 0; i < commands.size(); i++)
{
commands[i]->Undo();
}
} }; #endif
#ifndef __EQUIPMENT_H__
#define __EQUIPMENT_H__
#include <iostream>
using namespace std;
void print(const char *p)
{
cout << p << endl;
} class Light
{
public:
Light(){}
~Light(){}
void On(){print("Light On");}
void Off(){print("Light Off");}
}; class GarageDoor
{
public:
GarageDoor(){}
~GarageDoor(){}
void up(){ print("GarageDoor Up"); }
void down(){ print("GarageDoor Down"); }
void stop(){ print("GarageDoor Stop"); }
}; #endif
#ifndef __CONTROL_H__
#define __CONTROL_H__
#include "Command.h"
class SimpleRemoteControl
{
private:
Command * command;
public:
SimpleRemoteControl(){}
virtual ~SimpleRemoteControl(){}
void setCommand(Command *c)
{
command = c;
} void ButtonPressed()
{
command->Execute();
}
}; class RemoteControl
{
private:
Command * onCommand[7];
Command * offCommand[7];
NoCommand *ncommand;
Command *preCommand;
public:
RemoteControl()
{
ncommand = new NoCommand();
for (int i = 0; i < 7; i++)
{
onCommand[i] = ncommand;
offCommand[i] = ncommand;
}
}
~RemoteControl()
{
delete ncommand;
}
void SetCommand(int i, Command *on, Command *off)
{
onCommand[i] = on;
offCommand[i] = off;
} void OnButtonPress(int i)
{
onCommand[i]->Execute();
preCommand = onCommand[i];
} void OffButtonPress(int i)
{
offCommand[i]->Execute();
preCommand = offCommand[i];
}
void UndoButtonPress()
{
preCommand->Undo();
} };
#endif
#include "Control.h"
using namespace std; int main()
{
Light *light = new Light();
GarageDoor *gdoor = new GarageDoor();
SimpleRemoteControl *rc = new SimpleRemoteControl(); Command *lightoncommand = new LightOnCommand(light);
Command *lightoffcommand = new LightOffCommand(light);
Command *gdoordown = new GarageDoorDownCommand(gdoor);
Command *gdoorup = new GarageDoorUpCommand(gdoor); print("===Now is SimpleRemoteControl===");
rc->setCommand(lightoncommand);
rc->ButtonPressed();
rc->setCommand(lightoffcommand);
rc->ButtonPressed();
rc->setCommand(gdoorup);
rc->ButtonPressed();
rc->setCommand(gdoordown);
rc->ButtonPressed(); print("===Now is RemoteControl===");
RemoteControl *control = new RemoteControl();
vector<Command*>ptyBegin = { gdoorup, lightoncommand }; vector<Command*>ptyend = { lightoffcommand,gdoordown }; Command *pbegin = new PartyBeginCommand(ptyBegin);
Command *pend = new PartyBeginCommand(ptyend); control->SetCommand(0, lightoncommand, lightoffcommand);
control->SetCommand(1, gdoorup, gdoordown);
control->SetCommand(2, pbegin, pend);
control->OnButtonPress(0);
control->OffButtonPress(0);
control->OnButtonPress(1);
control->OffButtonPress(1);
print("---Undo---");
control->UndoButtonPress(); control->OnButtonPress(2);
control->OffButtonPress(2);
print("---Undo---");
control->UndoButtonPress(); return 0;
}
:命令模式:Command的更多相关文章
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
		命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ... 
- 设计模式 - 命令模式(command pattern) 具体解释
		命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ... 
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
		设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ... 
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
		命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ... 
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
		原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ... 
- 命令模式 Command 行为型 设计模式(十八)
		命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ... 
- Java 设计模式系列(十四)命令模式(Command)
		Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ... 
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
		命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ... 
- 二十四种设计模式:命令模式(Command Pattern)
		命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ... 
- 设计模式-15命令模式(Command Pattern)
		1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ... 
随机推荐
- jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第四话):把war包远程部署到tomcat
			上一节介绍了如何用Ant插件来打war包,本节接着介绍如何把build好的war自动部署到tomcat中 1.先安装 Deploy to container Plugin插件 2. 在构建后操作中添加 ... 
- springBoot springSecurty:  x-frame-options deny禁止iframe调用
			springBoot springSecurty: x-frame-options deny禁止iframe调用 https://blog.csdn.net/whiteforever/article ... 
- 图像识别 | AI在医学上的应用 | 深度学习 | 迁移学习
			参考:登上<Cell>封面的AI医疗影像诊断系统:机器之心专访UCSD张康教授 Identifying Medical Diagnoses and Treatable Diseases b ... 
- English trip V1 - 12.Belongings 行李 Teacher:Jade Key: ?
			In this lesson you will learn to describe your home life and things you own. 在本课中,您将学习如何描述您的家庭生活和您拥有 ... 
- Asp.net博客系统收集和简单介绍
			国内Asp.net博客系统收集和简单介绍 [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ... 
- int __get_order(unsigned long size)
			2017-12-6 10:26:504.9.51int __get_order(unsigned long size){ int order; size--; size >>= ... 
- Spring Boot 针对 Java 开发人员的安装指南
			Spring Boot 可以使用经典的开发工具或者使用安装的命令行工具.不管使用何种方式,你都需要确定你的 Java 版本为 Java SDK v1.8 或者更高的版本.在你开始安装之前,你需要确定你 ... 
- 【洛谷p1932】A+B A-B A*B A/B A%B Problem
			(emmmm) 这道题成功让我见识到了Dev撤回的高端大气上档(dàng)次. A+B A-B A*B A/B A%B Problem[传送门](真是个优秀的高精) 算法:::::::(模板题弄这么费 ... 
- Linux系统中文件定位与查找
			Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2 ... 
- jackson实体转json时 为NULL不参加序列化的汇总
			首先加入依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson ... 
