13.命令模式



1命令模式的核心内容是:

A:发命令者,与实际不同的是,发命令者要求了实际由谁做菜,烤肉。

B:有两个级别的服务员,一个级别的服务员每次只收集一个命令;另外一类服务员可以同时收集多条命令,最后通知厨子和Barbecuer

2命令模式的作用:通过命令模式可以模拟到餐馆下单,服务员向厨子发命令的这个场景。

3命令模式具体描述

命令模式:命令模式把一个请求或者操作封装到一个对象中。

命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

命令模式允许请求的一方和发送的一方独立开来,

使得请求的一方不必知道接收请求的一方的接口,

更不必知道请求是怎么被接收,

以及操作是否执行,何时被执行以及是怎么被执行的。

系统支持命令的撤消。

 

俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,

她对我有什么指示,就写一张纸条让她弟弟带给我。这不,

她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,

哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,

才请我吃面。”

4.命令模式类图

5.代码:

#include<iostream>

#include <string>

#include <list>

 

using namespace std;

//命令模式:命令模式把一个请求或者操作封装到一个对象中。

//命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

//命令模式允许请求的一方和发送的一方独立开来,

//使得请求的一方不必知道接收请求的一方的接口,

//更不必知道请求是怎么被接收,

//以及操作是否执行,何时被执行以及是怎么被执行的。

//系统支持命令的撤消。

//

//俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,

//她对我有什么指示,就写一张纸条让她弟弟带给我。这不,

//她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,

//哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,

//才请我吃面。”

 

//接收者执行命令,这里相当于实际干活的人

class Barbecuer 

{

public:

    void bakeMutton()

    {

        cout << "烤羊肉串" << endl;

    }

    void bakeChickenWing()

    {

        cout << "烤鸡翅" << endl;

    }

};

 

//对某个人下达的命令

class Command   //命令基类

{

protected:

    Barbecuer *receiver;//类的包含

public:

    Command(Barbecuer *receiver)//命令接受

    {

        this->receiver = receiver;

    }

    //然后执行命令

    virtual void executeCommand() = 0;

};

 

//相当于命令的特化

class BakeMuttonCommand :public Command

{

public:

    BakeMuttonCommand(Barbecuer *receiver) :Command(receiver)

    {}

    void executeCommand()

    {

        receiver->bakeMutton();

    }

};

 

//命令的特化

class BakeChikenWingCommand :public Command

{

public:

    BakeChikenWingCommand(Barbecuer *receiver) :Command(receiver)

    {}

    void executeCommand()

    {

        receiver->bakeChickenWing();

    }

};

 

//服务员,这里是当条命令

class Waiter

{

private:

    Command *command;

public:

    void setOrder(Command *command)

    {

        this->command = command;

    }

    void notify()

    {

        command->executeCommand();

    }

};

 

//gei多个对象下达命令,下多条命令的情况

class Waiter2 

{

private:

    list<Command*> orders;

public:

    //下单

    void setOrder(Command *command)

    {

        orders.push_back(command);

    }

    //取消订单

    void cancelOrder(Command *command)

    {

    }

    //发出通知

    void notify()

    {

        list<Command*>::iterator iter = orders.begin();

        while (iter != orders.end())

        {

            (*iter)->executeCommand();

            iter++;

        }

    }

};

 

 

int main()

{

 

    Barbecuer *boy = new Barbecuer();

    Command *bm1 = new BakeMuttonCommand(boy);

    Command *bm2 = new BakeMuttonCommand(boy);

    Command *bc1 = new BakeChikenWingCommand(boy);

 

    Waiter2 *girl = new Waiter2();

 

    girl->setOrder(bm1);

    girl->setOrder(bm2);

    girl->setOrder(bc1);

 

    girl->notify();

 

 

    cin.get();

 

    return 0;

}

运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值