那谁的技术博客
感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……
常见设计模式的解析和实现(C++)之十四-Command模式
作用:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.
UML结构图:
解析:
Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这里的Invoker类来调用.其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理是很相似的,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的.采用Command模式解耦了命令的发出者和命令的执行者.
实现:
1)Command.h
/**/
/*
*******************************************************************
created: 2006/08/04
filename: Command.h
author: 李创
http://www.cppblog.com/converse/
purpose: Command模式的演示代码
********************************************************************
*/
#ifndef COMMAND_H
#define
COMMAND_H
class
Command
{
public
:
virtual
~
Command()
{}
virtual
void
Execute()
=
0
;
}
;
class
Receiver
{
public
:
void
Action();
}
;
class
Invoker
{
public
:
Invoker(Command
*
pCommand);
~
Invoker();
void
Invoke();
private
:
Command
*
m_pCommand;
}
;
class
ConcreateComand
:
public
Command
{
public
:
ConcreateComand(Receiver
*
pReceiver);
virtual
~
ConcreateComand();
virtual
void
Execute();
private
:
Receiver
*
m_pReceiver;
}
;
#endif
2)Command.cpp
/**/
/*
*******************************************************************
created: 2006/08/04
filename: Command.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: Command模式的演示代码
********************************************************************
*/
#include
"
Command.h
"
#include
<
iostream
>
void
Receiver::Action()
{
std::cout
<<
"
Receiver Action\n
"
;
}
Invoker::Invoker(Command
*
pCommand)
: m_pCommand(pCommand)
{
}
Invoker::
~
Invoker()
{
delete m_pCommand;
m_pCommand
=
NULL;
}
void
Invoker::Invoke()
{
if
(NULL
!=
m_pCommand)
{
m_pCommand
->
Execute();
}
}
ConcreateComand::ConcreateComand(Receiver
*
pReceiver)
: m_pReceiver(pReceiver)
{
}
ConcreateComand::
~
ConcreateComand()
{
delete m_pReceiver;
m_pReceiver
=
NULL;
}
void
ConcreateComand::Execute()
{
if
(NULL
!=
m_pReceiver)
{
m_pReceiver
->
Action();
}
std::cout
<<
"
Execute by ConcreateComand\n
"
;
}
3)Main.cpp
/**/
/*
*******************************************************************
created: 2006/08/04
filename: main.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: Command模式的测试代码
********************************************************************
*/
#include
"
Command.h
"
#include
<
stdlib.h
>
int
main()
{
Receiver
*
pReceiver
=
new
Receiver();
Command
*
pCommand
=
new
ConcreateComand(pReceiver);
Invoker
*
pInvoker
=
new
Invoker(pCommand);
pInvoker
->
Invoke();
delete pInvoker;
system(
"
pause
"
);
return
0
;
}
posted on 2006-08-04 20:52
那谁
阅读(3440)
评论(4)
编辑
收藏
引用
所属分类:
设计模式
评论
#
re: 常见设计模式的解析和实现(C++)之十四-Command模式
回复
更多评论
写的不错,正在学习设计模式,写的非常好,得多向你学习!
2006-08-28 12:53 |
罗家峰
#
re: 常见设计模式的解析和实现(C++)之十四-Command模式
回复
更多评论
不错,学习中,以后常来你这里学习.谢谢
2006-08-28 13:01 |
罗家峰
#
re: 常见设计模式的解析和实现(C++)之十四-Command模式
回复
更多评论
写出了command的框架,我觉得command的主要特色在于可以随处传递,可以实现redo和undo,这在有ui的程序里是非常方便的。
2007-04-13 15:51 |
sirguan
#
re: 常见设计模式的解析和实现(C++)之十四-Command模式
回复
更多评论
无声的感谢
2013-02-25 16:53 |
江湖人
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
服务器公共库开发--线程安全的singleton类, 可配置的线程锁管理类
常见设计模式的解析和实现(C++)文档及源码打包下载
常见设计模式的解析和实现(C++)之二十一-完结篇
常见设计模式的解析和实现(C++)之二十-Visitor模式
常见设计模式的解析和实现(C++)之十九-Memento模式
常见设计模式的解析和实现(C++)之十八-Iterator模式
常见设计模式的解析和实现(C++)之十七-State模式
常见设计模式的解析和实现(C++)之十六-Strategy模式
常见设计模式的解析和实现(C++)之十五-Observer模式
常见设计模式的解析和实现(C++)之十四-Command模式
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 那谁
导航
C++博客
首页
联系
聚合
管理
<
2006年7月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
公告
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(71)
给我留言
查看公开留言
查看私人留言
随笔分类
(264)
avidya(1)
(rss)
C\C++(21)
(rss)
ccache(8)
(rss)
CGL(5)
(rss)
eventrpc(1)
(rss)
gdb(2)
(rss)
libevent(2)
(rss)
lighttpd(10)
(rss)
linux kernel(7)
(rss)
Linux/Unix(32)
(rss)
memcached(2)
(rss)
mktags(4)
(rss)
Nginx(5)
(rss)
Perl(3)
(rss)
tokyo cabinet(5)
(rss)
操作系统(1)
(rss)
读书笔记(3)
(rss)
服务器设计(42)
(rss)
脚本语言(1)
(rss)
经验教训(4)
(rss)
其他(10)
(rss)
设计模式(24)
(rss)
算法与数据结构(48)
(rss)
图形学(1)
(rss)
网络编程(22)
(rss)
随笔档案
(210)
2010年8月 (1)
2010年7月 (3)
2010年6月 (2)
2010年5月 (1)
2010年4月 (2)
2010年3月 (1)
2010年1月 (5)
2009年12月 (7)
2009年11月 (3)
2009年10月 (7)
2009年9月 (2)
2009年8月 (2)
2009年7月 (1)
2009年6月 (3)
2009年5月 (2)
2009年4月 (7)
2009年3月 (2)
2009年2月 (2)
2009年1月 (5)
2008年12月 (1)
2008年11月 (2)
2008年10月 (6)
2008年9月 (12)
2008年8月 (11)
2008年7月 (5)
2008年6月 (2)
2008年4月 (3)
2008年3月 (3)
2008年2月 (1)
2008年1月 (1)
2007年12月 (3)
2007年11月 (3)
2007年8月 (1)
2007年7月 (2)
2007年6月 (2)
2007年5月 (9)
2007年4月 (1)
2007年3月 (8)
2007年2月 (3)
2007年1月 (5)
2006年12月 (4)
2006年11月 (3)
2006年10月 (5)
2006年9月 (4)
2006年8月 (13)
2006年7月 (28)
2006年4月 (1)
2006年3月 (4)
2006年2月 (4)
2006年1月 (1)
2005年12月 (1)
相册
ccache
lighttpd
tokyo cabinet
文件
关于我
我的google reader share
我的google reader share
开源项目
libevent
lighttpd
memcached
PCRE for Windows (Win32)
sqlite
STLFilt
论坛
ChinaUnix
OldLinux
朋友
cugb_cat
Edengundam
win_hate
ypxing
老罗
搜索
最新评论
1. re: memcached采用的网络模型
很好的文章,值得分享。
--纽约网站设计
2. re: 常见设计模式的解析和实现(C++)文档及源码打包下载
评论内容较长,点击标题查看
--残阳丛林
3. re: libevent事件处理框架分析
@hailong
拿走后,堆的恢复是logn
--jiao
4. re: 从半同步-半异步模式谈服务器的设计
学习服务器的一些代码模式。
--王小亮
5. re: 让libevent支持多线程
刚开始以为有个新的方法可以实现多线程。。。。其实就试类似pipe的方式, memcache就是这样做的,可以参考一下
--fly2010love
阅读排行榜
1. 同步/异步与阻塞/非阻塞的区别(53052)
2. libevent事件处理框架分析(45216)
3. epoll学习笔记(41123)
4. 解读google C++ code style谈对C++的理解(38117)
5. 集成libevent,google protobuf的RPC框架(27419)
6. 常见设计模式的解析和实现(C++)文档及源码打包下载(24032)
7. 让libevent支持多线程(23586)
8. 一个关于临时对象和虚拟析构函数的问题(22307)
9. epoll为什么这么快(20247)
10. 二叉树遍历算法集合(前中后序遍历的递归和非递归算法,层序遍历算法)(20231)
11. Callback在C\C++中的实现(20057)
12. 二分查找算法(迭代和递归版本)(18306)
13. 谈目前项目组的代码提交制度(17879)
14. Linux下面的线程锁,条件变量以及信号量的使用(15658)
15. C++的流设计很糟糕(14670)
16. 二分查找学习札记(14276)
17. memcached采用的网络模型(13924)
18. 红黑树的实现源码(第二次修订版)(13656)
19. 多进程服务器中,epoll的创建应该在创建子进程之后(12681)
20. 第一个socket程序-C\S模式的文件传输程序(12241)
21. 使用tolua++创建基于C\C++语言的lua脚本(12051)
22. 博客迁移(11610)
23. 从半同步-半异步模式谈服务器的设计(11573)
24. Lighty与Nginx的比较分析(11548)
25. Btree算法实现代码(11543)
26. 向德国人低头(11449)
27. epoll相关资料整理(11273)
28. 把二分查找算法写正确需要注意的地方(11138)
29. 程序设计经验总结(10217)
30. 我的项目Makefile文件模板(10155)
31. 带超时机制的DNS解析API(9519)
32. 方法与工具(9376)
33. 自己设想的一个IM服务器的架构(9180)
评论排行榜
1. 常见设计模式的解析和实现(C++)文档及源码打包下载(90)