那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,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 那谁 阅读(3236) 评论(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 | 江湖人

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理