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》一书中举了一个遥控器的例子,有兴趣的可以看看
相关文章推荐
- 21.命令模式--Command
- 《head first 设计思想》day six 命令模式
- 设计模式之——命令(Command)模式
- 命令模式——对象行为型模式
- 命令模式--command
- C++实现Undo和Redo框架(命令模式)
- 个人理解--代理模式和命令模式区别
- 命令模式(Command)
- 【设计模式】命令模式
- 设计模式之命令模式(卷十四)
- 设计模式_命令模式
- PHP草根论之设计模式-命令模式
- 70.设计模式笔记-命令模式
- 设计模式(行为型模式) ----- 命令模式(Command)
- .NET中的设计模式四:命令模式 选择自 lane_cn 的 Blog
- 23种设计模式(14)_行为型_命令模式(Command Pattern)
- Linux的vim三种模式及命令
- 命令模式
- java 设计模式-命令模式
- vim进入编辑模式、vim命令模式