设计模式14 - 命令模式

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 命令模式又称为动作(Action)模式或事务(Transaction)模式。

使用场景

  • 当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。
  • 当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。
  • 当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。
  • 当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。

优缺点

  • 优点:
    1、降低了系统耦合度。
    2、新的命令可以很容易添加到系统中去。

  • 缺点:
    使用命令模式可能会导致某些系统有过多的具体命令类。

注意事项

  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
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值