常見設(shè)計模式的解析和實現(xiàn)(C++)之十四-Command模式
作用:
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作.
UML結(jié)構(gòu)圖:

解析:
Comnand模式的思想是把命令封裝在一個類中,就是這里的Command基類,同時把接收對象也封裝在一個類中就是這里的Receiver類中,由調(diào)用這個命令的類也就是這里的Invoker類來調(diào)用.其實,如果弄清楚了Command模式的原理,就會發(fā)現(xiàn)其實它和注冊回調(diào)函數(shù)的原理是很相似的,而在面向過程的設(shè)計中的回調(diào)函數(shù)其實和這里的Command類的作用是一致的.采用Command模式解耦了命令的發(fā)出者和命令的執(zhí)行者.
實現(xiàn):
1)Command.h

/**//********************************************************************
????created:????2006/08/04
????filename:?????Command.h
????author:????????李創(chuàng)
????????????????http://m.shnenglu.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:????????李創(chuàng)
????????????????http://m.shnenglu.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:????????李創(chuàng)
????????????????http://m.shnenglu.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;
}
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作.
UML結(jié)構(gòu)圖:
解析:
Comnand模式的思想是把命令封裝在一個類中,就是這里的Command基類,同時把接收對象也封裝在一個類中就是這里的Receiver類中,由調(diào)用這個命令的類也就是這里的Invoker類來調(diào)用.其實,如果弄清楚了Command模式的原理,就會發(fā)現(xiàn)其實它和注冊回調(diào)函數(shù)的原理是很相似的,而在面向過程的設(shè)計中的回調(diào)函數(shù)其實和這里的Command類的作用是一致的.采用Command模式解耦了命令的發(fā)出者和命令的執(zhí)行者.
實現(xiàn):
1)Command.h

/**//********************************************************************
????created:????2006/08/04
????filename:?????Command.h
????author:????????李創(chuàng)
????????????????http://m.shnenglu.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:????????李創(chuàng)
????????????????http://m.shnenglu.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:????????李創(chuàng)
????????????????http://m.shnenglu.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 那誰 閱讀(3481) 評論(4) 編輯 收藏 引用 所屬分類: 設(shè)計模式

