第二十三章-命令模式

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

烧烤程序

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include<vector>
#include<string>
#include<ctime>

using namespace std;

class Barbecuer
{
public:
    void BakeMutton()
    {
        cout << "烤羊肉串!" << endl;
    }

    void BakeChickenWing()
    {
        cout << "烤鸡翅!" << endl;
    }
};

class Command
{
protected:
    Barbecuer* receiver;

public:
    Command(Barbecuer* receiver_t)
    {
        receiver = receiver_t;
    }

    virtual void ExcuteCommand() = 0;
};

class BakeMuttonCommand :public Command
{
public:
    BakeMuttonCommand(Barbecuer* receiver)
        :Command(receiver)
    { }

    void ExcuteCommand()
    {
        receiver->BakeMutton();
    }
};

class BakeChickenWingCommand :public Command
{
public:
    BakeChickenWingCommand(Barbecuer* receiver)
        :Command(receiver)
    { }

    void ExcuteCommand()
    {
        receiver->BakeChickenWing();
    }
};

class Waiter
{
private:
    vector<Command*> orders;

public:
    void SetOrder(Command* command)
    {
        if (typeid(*command) == typeid(BakeChickenWingCommand))
        {
            cout << "服务员:鸡翅没有了,请点别的烧烤。" << endl;
        }
        else
        {
            orders.push_back(command);
            time_t curtime;
            time(&curtime);
            cout << "增加订单: " << typeid(*command).name()
                << " 时间:" << ctime(&curtime) << endl;
        }
    }

    void CancelOrder(Command* command)
    {
        for (auto iter = orders.begin(); iter != orders.end(); iter++)
        {
            if (*iter == command)
            {
                orders.erase(iter);
                time_t curtime;
                time(&curtime);
                cout << "取消订单: " << typeid(*command).name()
                    << " 时间:" << ctime(&curtime) << endl;
            }
        }
    }

    void Notify()
    {
        for (auto _i : orders)
        {
            _i->ExcuteCommand();
        }
    }

};

int main()
{
    Barbecuer* boy = new Barbecuer();
    Command* bakeMuttonCommand1 = new BakeMuttonCommand(boy);
    Command* bakeMuttonCommand2 = new BakeMuttonCommand(boy);
    Command* bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
    Waiter* girl = new Waiter();

    girl->SetOrder(bakeMuttonCommand1);
    girl->SetOrder(bakeMuttonCommand2);
    girl->SetOrder(bakeChickenWingCommand1);

    girl->Notify();

    system("pause");
    return 0;
}

命令模式的作用

  • 第一,它能较容易的设计一个命令队列。
  • 第二,在学要的情况下,可以较容易的将命令记入日志。
  • 第三,允许接收请求的一方决定是否要否决请求。
  • 第四,可以容易的实现对请求的撤销和重做。
  • 第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
  • 第六,命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

原文地址:https://www.cnblogs.com/wfcg165/p/12048987.html

时间: 2024-07-31 15:05:23

第二十三章-命令模式的相关文章

Gradle 1.12用户指南翻译——第二十三章. Java 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

第 12 章 命令模式【Command Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真是是世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参见工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好

扣响C#之门笔记--第二十三章

23.1 泛型的概念 (1)在普通集合中,元素均被看做是object类型,会有以下缺点(a)赋值时候将类型转为object,使用时候又将object转为对应的类型,在装箱和拆箱时候造成一定性能损失:(b)任何类型的数据都可以放进集合里面,不利于类型安全检查: static void Main(string[] args) { Queue q = new Queue(); q.Enqueue(10); q.Enqueue("wo"); // q.Enqueue(1); foreach (

第14章 命令模式(Command Pattern)

原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern) 概述   在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建

Head First 设计模式 第6章 命令模式

第6章 命令模式 在本章,我们将把封装带到一个全新的境界,把方法调用封装起来.没错,通过方法调用,我们可以把运算块包装成型.所以,调用此运算的对象不需要关心运算是如何进行的,只要知道如何使用包装成型的方法来完成它就可以.通过封装方法调用,我们还可役做一些其他很重要的事情,例如记录日志,或者重复使用封装来实现撤销操作. 首先,让我们来看下命令模式吧. 1丶定义:将“请求”封装成对象,以便使用不同的请求,日志或者队列来参数化其他对象,由其他对象来完成“请求”的实际调用,以达到请求的发起者和执行者之间

第二十三章

曲则全,枉则正,洼则盈,敝则新,少则得,多则惑.是以圣人执一,为天下牧.不自视故彰:不自见故明:不自伐故有功:弗矜故能长.夫唯不争,故莫能与之争.古之所谓「曲则全」者,几语哉!诚全归之. 罗大伦道德经文字版-第二十三章1 暂时的隐忍会换来更多 各位朋友大家好,今天我们接着来聊<道德经>.我们今天聊到了第二十三章了,慢慢改变,这也说明改变已经很巨大了,我们一点点学.一点点提升,我与您一起往前走.其实我在讲<道德经>的过程中,我也在提升,我也在学习,我们一起来学习,三年之约,我们不见不

大话设计模式C++实现-第23章-命令模式

一.UML图 二.概念 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求进行排队或记录请求日志,以及支持可撤销的操作. 三.说明 角色: (1)Command类:用来声明执行操作的接口. (2)ConcreteCommand类:将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Excute. (3)Invoker类:要求该命令执行这个请求. (4)Receiver类:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者.

第二十三章、软件安装: RPM, SRPM 与 YUM 功能

SRPM 的使用 : rpmbuild 包含Source code 的 SRPM 新版的 rpm 已经将 RPM 与 SRPM 的命令分开了,SRPM 使用的是 rpmbuild 这个命令,而不是 rpm !如果你是 Red Hat 7.3 以前的用户,那么请使用 rpm 来替代 rpmbuild ! 利用默认值安装 SRPM 文件 (--rebuid/--recompile) --rebuild 这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产生的

C++程序设计原理与实践 第二十三章部分答案

1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <list> 5 #include<fstream> 6 #include <set> 7 #include<algorithm> 8 #include<stdexcept> 9 #include <map> 10 #include<boost/re