c++设计模式(13)-Comnand模式

作用:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.

UML结构图:


解析:
       Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver类中,由调用这个命令的类也就是这里的Invoker类来调用.其实,如果弄清楚了Command模式的原理,就会发现其实它和注册回调函数的原理是很相似的,而在面向过程的设计中的回调函数其实和这里的Command类的作用是一致的.采用Command模式解耦了命令的发出者和命令的执行者.

实现:
1)Command.h

/**/ /********************************************************************
    filename:     Command.h

    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

/**/ /********************************************************************
    filename:     Command.cpp
    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

/**/ /********************************************************************
     filename:     main.cpp
    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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部