您的位置:首页 > 编程语言 > C语言/C++

c++/qt设计模式-命令模式

2018-02-08 09:49 567 查看
文章中部分内容和思路来自《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》一书中举了一个遥控器的例子,有兴趣的可以看看
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息