程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 設計模式的解析和實現(C++)之十四-Command模式

設計模式的解析和實現(C++)之十四-Command模式

編輯:關於C++

作用:

將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作.

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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved