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 ...
随机推荐
- 组合数学及其应用——格路径与Schroder数
格路径问题是探讨在如下所示中的一个格点图上,从(0,0)位置到达(p,q)所有可能的情况数.我们称这样的通路为一条格路径. 格点图: · · · · · · · · · · · · · · · · · ...
- boost------function的使用(Boost程序库完全开发指南)读书笔记
function是一个函数对象的“容器”,概念上像是c/c++中函数指针类型的泛化,是一种“智能函数指针”.它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象. 因此, ...
- Java 随机生成中文姓名,手机号,邮编,住址
package lovo; import java.util.HashMap; import java.util.Map; /** * 随机生成中文姓名,性别,Email,手机号,住址 * @auth ...
- 错误: 找不到或无法加载主类 / Class not found
Java Resources文件上有红色感叹号存在 说明引入jar包存在错误,把引用错误的jar包去掉即可. 右键项目,Properties,Java Build Path,选中jar包remove, ...
- Derby使用2—C/S模式
零.回顾 这部分先来回顾一下上一篇博客中的主要内容.上一篇博客中主要简单介绍了Derby数据的历史,特点,安装以及使用的两种模式.这篇文章主要介绍这两种模式中的一种模式 一.启动服务端程序 第一部分主 ...
- TreeView查获节点并选中节点
TreeView查获节点并选中节点如果有多个节点则会继续查找下一个节点 支持关键字搜索 private void SearchNodes(string SearchText, TreeNode Sta ...
- PHP扩展开发01:第一个扩展【转】
我们先假设业务场景,是需要有这么一个扩展,提供一个叫ccvita_string的函数,他的主要作用是返回一段字符.(这个业务场景实在太假,大家就这么看看吧)对应的PHP代码可能是这样: functio ...
- Project interpreter not specified(eclipse+pydev)
[小记] 近期由于想配置Android的开发环境,把原来的MyEclipse5.5删了,下载了最新的Eclipse3.7版本号,由于之前在进行Python开发,就下载了最新的Pydev2.4版本号,安 ...
- kontalk
Site: http://kontalk.org/ Code: https://github.com/kontalk/androidclient
- 让ie9之前的版本支持canvas
原来google的研发人员早就帮我们解决了这问题. 在这里我们得首先感谢google 在这链接http://excanvas.sourceforge.net/ 下载下来后 吧excanvas.js引入 ...