作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 命令模式又称为动作(Action)模式或事务(Transaction)模式。
使用场景
- 当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。
- 当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。
- 当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。
- 当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。
优缺点
-
优点:
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。 -
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。
注意事项
- 命令模式的特点就是把动作或者行为进行封装和抽象,一般我们可能很难把代码抽象到这个程度或者想到这个模式,因为并不是每个需求都是"遥控器"。
- 命令模式与状态模式有一定的相似点,不过,命令模式强调自己的动作,而状态模式强调『主体』的状态。
UML结构图
代码实现
stock.h
创建请求类 Stock,声明两个请求 buy和 sell
#include <string>
#include <iostream>
using namespace std;
class Stock
{
public:
void buy()
{
cout << "Stock [ Name: " + name +
", Quantity: " + std::to_string(quantity) + " ] bought" << endl;
}
void sell()
{
cout << "Stock [ Name: " + name +
", Quantity: " + std::to_string(quantity) + " ] sold" << endl;
}
private:
string name = "test";
int quantity = 10;
};
interface.h
创建抽象类 - Order;创建实体类 - BuyStock、SellStock
#include "stock.h"
class Order //基类-命令
{
public:
Order() {}
virtual ~Order() {}
virtual void execute() = 0;
};
class BuyStock: public Order //子类-执行买请求
{
public:
BuyStock(Stock *stock) : stock(stock) {}
void execute() { stock->buy(); }
private:
Stock *stock;
};
class SellStock: public Order //子类-执行卖请求
{
public:
SellStock(Stock *stock) : stock(stock) {}
void execute() { stock->sell(); }
private:
Stock *stock;
};
broker.h
创建命令执行类 Broker
#include <vector>
#include "interface.h"
class Broker
{
public:
void addOrder(Order *order)
{
vector.push_back(order);
}
void executeAllOrder()
{
for(auto it : vector)
{
it->execute();
}
vector.clear();
}
private:
std::vector<Order *> vector;
};
main.cpp
实例应用 - 使用broker 类接受命令,并寻找可以处理该命令的合适的对象去执行
#include "broker.h"
int main()
{
Stock * stock = new Stock(); //请求
Order * buyStock = new BuyStock(stock); //命令
Order * sellStock = new SellStock(stock); //命令
Broker * broker = new Broker();
broker->addOrder(buyStock);
broker->addOrder(sellStock);
broker->executeAllOrder();
return 0;
}
运行结果:
Stock [ Name: test, Quantity: 10 ] bought
Stock [ Name: test, Quantity: 10 ] sold