行为设计模式---命令模式(Command)

本文介绍命令模式的基本概念,包括其组成部分及优点,并通过一个具体的买票示例演示了如何使用命令模式来实现请求的封装和解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销的操作

(1)Command,用来声明执行操作的接口
(2)ConcreteCommand,将一个接收者对象绑定于一个操作,调用接收者相应的操作,以实现Execute
(3)Invoker类,要求该命令执行这个请求
(4)Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

Command模式通过将请求封装到一个对象Command中,并将请求的接收者存放到具体的ConcreteCommand类中,
从而实现调用操作的对象和操作的具体实现者之间的解耦。

Command模式结构图中,将请求的接收者(处理者)放到Command的具体子类ConcreteCommand中,
当请求到来时(agent发出buy消息激活Command对象),ConcreteCommand将处理请求交给Receiver对象进行处理。

优点:
(1)能较容易地设计一个命令队列;
(2)在需要的情况下,可以较容易地将命令记入日志;
(3)允许接收请求的一方决定是否要否决请求。
(4)可以容易地实现对请求的撤销和重做;
(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

#include <iostream>
#include <vector>
using namespace std;

class Receiver
{
public:
        void takeAction()
        {
                cout << "receiver takes action" << endl;
        }
};

class Command
{
public:
        virtual void execute() = 0;
        virtual void undo() = 0;
        virtual ~Command() { }
};

class BuyTicket : public Command
{
public:
        BuyTicket(Receiver *receiver) : receiver_(receiver)
        {
        }

        void execute()
        {
                receiver_->takeAction();
        }

        void undo()
        {
                cout << "the pool is full, please wait" << endl;
        }

private:
        Receiver *receiver_;
};

class Agent
{
public:
        void buy(Command *cmd)
        {
                if (vec_.size() > 3)
                {
                        cmd->undo();
                        vec_.pop_back();
                }
                else
                {
                        vec_.push_back(cmd);
                        cmd->execute();
                }
        }

private:
        vector<Command *> vec_;
};

int main()
{
        Receiver receiver;
        BuyTicket buyticket(&receiver);
        Agent agent;
        for (int i = 0; i < 5; ++i)
                agent.buy(&buyticket);

        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值