文章中部分内容和思路来自《Head First设计模式》
模式定义
将"请求"封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的
模式类图
典型案例
1.案例说明
假设客户去银行办理存取款业务,业务员根据客户业务的不同对客户账户进行存取款操作。在这个案例中,我们可以将业务员看做命令的发出者,客户账号看做命令接收者,具体命令是存款取款
2.代码实现
----------
ICommond.h
----------
#ifndef ICOMMOND_H
#define ICOMMOND_H
class ICommond
{
public:
virtual void execute() = 0;
};
#endif // ICOMMOND_H
----------------
MoneyInCommond.h
----------------
#ifndef MONEYINCOMMOND_H
#define MONEYINCOMMOND_H
#include "ICommond.h"
#include "Account.h"
class MoneyInCommond : public ICommond
{
public:
MoneyInCommond(Account *acc, float amount);
virtual ~MoneyInCommond();
public:
virtual void execute();
private:
Account *_acc;
float _amount;
};
#endif // MONEYINCOMMOND_H
------------------
MoneyInCommond.cpp
------------------
#include "MoneyInCommond.h"
MoneyInCommond::MoneyInCommond(Account *acc, float amount)
{
_acc = acc;
_amount = amount;
}
MoneyInCommond::~MoneyInCommond()
{
}
void MoneyInCommond::execute()
{
_acc->moneyIn(_amount);
}
-----------------
MoneyOutCommond.h
-----------------
#ifndef MONEYOUTCOMMOND_H
#define MONEYOUTCOMMOND_H
#include "ICommond.h"
#include "Account.h"
class MoneyOutCommond : public ICommond
{
public:
MoneyOutCommond(Account *acc, float amount);
virtual ~MoneyOutCommond();
public:
virtual void execute();
private:
Account *_acc;
float _amount;
};
#endif // MONEYOUTCOMMOND_H
-------------------
MoneyOutCommond.cpp
-------------------
#include "MoneyOutCommond.h"
MoneyOutCommond::MoneyOutCommond(Account *acc, float amount)
{
_acc = acc;
_amount = amount;
}
MoneyOutCommond::~MoneyOutCommond()
{
}
void MoneyOutCommond::execute()
{
_acc->moneyOut(_amount);
}
---------
Account.h
---------
#ifndef ACCOUNT_H
#define ACCOUNT_H
class Account
{
public:
Account();
public:
void moneyIn(float value); // 存钱
void moneyOut(float value); // 取钱
float getTotal() const; // 获取总额
private:
float _total;
};
#endif // ACCOUNT_H
-----------
Account.cpp
-----------
#include "Account.h"
Account::Account()
{
_total = 0;
}
void Account::moneyIn(float value)
{
_total += value;
}
void Account::moneyOut(float value)
{
_total -= value;
}
float Account::getTotal() const
{
return _total;
}
---------
Invoker.h
---------
#ifndef INVOKER_H
#define INVOKER_H
#include "ICommond.h"
class Invoker
{
public:
Invoker();
public:
void setCommond(ICommond *cmd);
void commondExecute();
private:
ICommond *_cmd;
};
#endif // INVOKER_H
-----------
Invoker.cpp
-----------
#include "Invoker.h"
Invoker::Invoker()
{
}
void Invoker::setCommond(ICommond *cmd)
{
_cmd = cmd;
}
void Invoker::commondExecute()
{
_cmd->execute();
}
--------
main.cpp
--------
/**
* 设计模式-命令模式
* 要素:1,执行者 2,抽象命令 3,具体命令 4,接受者[作用对象]
*/
#include <QCoreApplication>
#include <QDebug>
#include "Account.h"
#include "Invoker.h"
#include "MoneyInCommond.h"
#include "MoneyOutCommond.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Account *acc = new Account;
MoneyInCommond *inCmd = new MoneyInCommond(acc, 34);
Invoker *bankAssist = new Invoker;
bankAssist->setCommond(inCmd); // 银行职员先给账户存钱
bankAssist->commondExecute();
qDebug() << "账户余额:" << acc->getTotal();
MoneyOutCommond *outCmd = new MoneyOutCommond(acc, 45);
bankAssist->setCommond(outCmd); // 银行职员从账户取钱
bankAssist->commondExecute();
qDebug() << "账户余额:" << acc->getTotal();
delete outCmd;
outCmd = NULL;
delete bankAssist;
bankAssist = NULL;
delete inCmd;
inCmd = NULL;
delete acc;
acc = NULL;
return a.exec();
}
案例不太好,但基本能说明问题,《Head First》一书中举了一个遥控器的例子,有兴趣的可以看看