注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

写着玩

Bob

 
 
 

日志

 
 
 
 

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

2009-05-31 23:11:18|  分类: GOF设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://tech.ddvip.com/2009-03/1238319066112759.html

作用:

  将一个请求封装为一个对象,从而使你可用

  UML结构图:

设计模式的解析和实现(C++)之十四-Command模式 - yolcy - yolcy的博客

  图片看不清楚?请点击这里查看原图(大图)。

  解析:

  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 Actionn";

}

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 ConcreateComandn";

}

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;

}

  评论这张
 
阅读(360)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017