常见设计模式的解析和实现(C++)之十四-Command模式

常见设计模式的解析和实现(C++)之十四-Command模式

转:http://www.cppblog.com/converse/archive/2006/08/04/10855.html

作用:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.
UML结构图:
常见设计模式的解析和实现(C++)之十四-Command模式_第1张图片

解析:
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;
}

你可能感兴趣的:(常见设计模式的解析和实现(C++)之十四-Command模式)