Headfirst设计模式的C++实现——命令模式(Command)
先看如果不用命令模式的实现:
light.h
#ifndef _LIGHT_H_
#define _LIGHT_H #include <iostream> class LIGHT {
public:
void on() { std::cout << "light is on" << std::endl; }
void off() { std::cout << "light is off" << std::endl; }
}; #endif
tv.h
#ifndef _TV_H_
#define _TV_H_ #include <iostream> class TV {
public:
void open() { std::cout << "TV is opened" << std::endl; }
void close() { std::cout << "TV is closed" << std::endl; }
};
#endif
remote.h
#ifndef _REMOTE_H_
#define _REMOTE_H_ #include <string>
#include <iostream>
#include "tv.h"
#include "light.h" class REMOTE {
public:
void set(int slot, const std::string& device) {
if ( slot < MAX_SLOT_NUM ) {
all_device[slot] = device;
}
} void press_on_button(int slot) {
if ( slot >= MAX_SLOT_NUM ) {
return;
}
if ( all_device[slot] == "" ) {
std::cout << "slot " << slot << " is empty" << std::endl;
}
else {
if ( "TV" == all_device[slot] ) {
TV tv;
tv.open();
}
else if ( "LIGHT" == all_device[slot] ) {
LIGHT light;
light.on();
}
else {
std::cout << "invalid type" << std::endl;
}
}
} void press_off_button(int slot) {
if ( slot >= MAX_SLOT_NUM ) {
return;
}
if ( all_device[slot] == "" ) {
std::cout << "slot " << slot << " is empty" << std::endl;
}
else {
if ( "TV" == all_device[slot] ) {
TV tv;
tv.close();
}
else if ( "LIGHT" == all_device[slot] ) {
LIGHT light;
light.off();
}
else {
std::cout << "invalid type" << std::endl;
} }
}
private:
const static int MAX_SLOT_NUM = ;
std::string all_device[MAX_SLOT_NUM];
}; #endif
main.cpp
#include "remote.h"
int main() {
REMOTE remote;
remote.set(, "TV");
remote.set(, "LIGHT");
remote.press_on_button();
remote.press_off_button();
remote.press_on_button();
}
再看看使用命令模式的实现
light.h和tv.h不变
command.h
#ifndef _COMMAND_H_
#define _COMMAND_H_ class COMMAND {
public:
virtual void execute() = ;
}; #endif
light_on_command.h
#ifndef _LIGHT_ON_COMMAND_H_
#define _LIGHT_ON_COMMAND_H_ #include "command.h"
#include "light.h" class LIGHT_ON_COMMAND : public COMMAND {
private:
LIGHT &light;
public:
LIGHT_ON_COMMAND( LIGHT &_light ) : light(_light) {}
void execute() { light.on(); }
}; #endif
light_off_command.h
#ifndef _LIGHT_OFF_COMMAND_H_
#define _LIGHT_OFF_COMMAND_H_ #include "command.h"
#include "light.h" class LIGHT_OFF_COMMAND : public COMMAND {
private:
LIGHT &light;
public:
LIGHT_OFF_COMMAND( LIGHT &_light ) : light(_light) {}
void execute() { light.off(); }
}; #endif
tv_on_command.h
#ifndef _TV_ON_COMMAND_H_
#define _Tv_ON_COMMAND_H_ #include "command.h"
#include "tv.h" class TV_ON_COMMAND : public COMMAND {
private:
TV &tv;
public:
TV_ON_COMMAND( TV&_tv) : tv(_tv) {}
void execute() { tv.open(); }
}; #endif
tv_off_command.h
#ifndef _TV_OFF_COMMAND_H_
#define _TV_OFF_COMMAND_H_ #include "command.h"
#include "tv.h" class TV_OFF_COMMAND : public COMMAND {
private:
TV &tv;
public:
TV_OFF_COMMAND( TV&_tv) : tv(_tv) {}
void execute() { tv.close(); }
}; #endif
remote.h
#ifndef _REMOTE_H_
#define _REMOTE_H_ #include "command.h"
#include <iostream> class REMOTE {
public:
REMOTE() {
for ( int i = ; i < MAX_SLOT_NUM; i++ ) {
on_commands[i] = NULL;
off_commands[i] = NULL;
}
} void set(int slot, COMMAND& on_command, COMMAND& off_command) {
if ( slot < MAX_SLOT_NUM ) {
on_commands[slot] = &on_command;
off_commands[slot] = &off_command;
}
} void press_on_button(int slot) {
if ( slot < MAX_SLOT_NUM ) {
if ( NULL != on_commands[slot] ) {
on_commands[slot]->execute();
}
else {
std::cout << "slot " << slot << " is empty" << std::endl;
}
}
} void press_off_button(int slot) {
if ( slot < MAX_SLOT_NUM ) {
if ( NULL != off_commands[slot] ) {
off_commands[slot]->execute();
}
else {
std::cout << "slot " << slot << " is empty" << std::endl;
}
}
}
private:
const static int MAX_SLOT_NUM = ;
COMMAND *on_commands[MAX_SLOT_NUM];
COMMAND *off_commands[MAX_SLOT_NUM];
}; #endif
main.cpp
#include "remote.h"
#include "tv_on_command.h"
#include "tv_off_command.h"
#include "light_on_command.h"
#include "light_off_command.h" int main() {
REMOTE remote; TV tv;
TV_ON_COMMAND tv_on_command(tv);
TV_OFF_COMMAND tv_off_command(tv);
remote.set(, tv_on_command, tv_off_command); LIGHT light;
LIGHT_ON_COMMAND light_on_command(light);
LIGHT_OFF_COMMAND light_off_command(light);
remote.set(, light_on_command, light_off_command); remote.press_on_button();
remote.press_off_button();
remote.press_on_button();
}
Headfirst设计模式的C++实现——命令模式(Command)的更多相关文章
- headfirst设计模式(7)—命令模式
一.前言 什么是命令模式? 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]
1 2{<HeadFirst设计模式>之命令模式 } 3{ 本单元中的类为命令的接收者 } 4{ 编译工具 :Delphi7.0 } 5{ 联 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]
命令模式可以很轻松的实现撤销(Undo)功能. 命令的接受者: 1unit uReceiveObject; 2 3interface 4 5type 6 TLight = class(T ...
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 命令模式 Command 行为型 设计模式(十八)
命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Java 设计模式系列(十四)命令模式(Command)
Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
随机推荐
- (qsf文件 、 tcl文件 和 csv(txt)文件的区别) FPGA管脚分配文件保存、导入导出方法
FPGA管脚分配文件保存方法 使用别人的工程时,有时找不到他的管脚文件,但可以把他已经绑定好的管脚保存下来,输出到文件里. 方法一: 查看引脚绑定情况,quartus -> assignment ...
- 使用Camstudio和KeyCastOW来录屏制作软件Demo视频
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用Camstudio和KeyCastOW来录屏制作软件Demo视频.
- tomcat热部署,更改java类不用重新加载context
修改类后,tomcat热部署会重新加载整个项目的context,影响开发效率.网上查的大多数是将server的modules标签中Auto Reload项改为Disabled,但是没有效果. 使用以下 ...
- Android实时监听网络状态(2)
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒.一般可以通过ConnectivityManager来完成该工作. ConnectivityMana ...
- Android-怎样用命令行进行打包
转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/40978859 1.生成R文件 aapt package -f -m -J . ...
- 数字信号处理与音频处理(使用Audition)
前一阵子由于考博学习须要,看了<数字信号处理>,之前一直不清除这门课的理论在哪里应用比較广泛. 这次正巧用Audition处理了一段音频,猛然发现<数字信号处理>这门课还是很实 ...
- Highcharts简介
最近要做一个油田油压或温度数据的监控软件,数据会秒级写到数据库中,界面上需要动态展示数据跟随时间变化. 在网上找了很多js插件,希望能够即时高效的展示数据,最终确定了使用Highcharts插件. H ...
- java13 InputStream,Reader
流的方向: .输入流:数据源到程序(InputStream,Reader读进来). .输出流:程序到目的地(OutPutStream,Writer写出来). 处理数据单元: 字节流:按照字节读取数据( ...
- GOOGLE------Reilly_Open_Source_Award
https://en.wikipedia.org/wiki/O%27Reilly_Open_Source_Award#2016
- 使用new分配内存的类需要自己定义拷贝构造函数
13.22 假定我们希望HasPtr的行为像一个值.即,对于对象所指向的string成员,每个对象都有一份自己的拷贝. #include<iostream> #include<str ...