您的位置:首页 > 其它

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

2014-08-20 15:18 369 查看
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;

对请求排队或记录请求日志,以及支持可撤销的操作



(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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: