详解设计模式中的Command命令模式及相关C++实现

详解设计模式中的Command命令模式及相关C++实现

什么是Command模式?

Command模式是一种行为型设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求、队列或日志请求参数化客户端对象。该模式还支持撤销操作。

Command模式的角色

Command模式涉及以下四个角色:

  • Receiver: 程序执行实际操作的对象(比如照明系统、音响设备等)。

  • Command:把调用指令封装成每个命令对象中的对象。

  • Invoker:给出一个适当的命令,然后按照客户端的要求执行命令。

  • Client:实际上是一个使用Invoker类的对象。

Command模式的实现

在C++语言中,可以通过将Command实现为抽象基类,并调用实际操作的虚函数来实现这种模式。

下面是一个使用Command模式控制灯光的示例:

实现步骤

1.定义包含"switch_on"和"switch_off" 函数的Receiver类。

class Receiver {
public:
    void switch_on() {
        cout << "Light switched on!" << endl;
    }

    void switch_off() {
        cout << "Light switched off!" << endl;
    }
};

2.定义Command类,使用其中的"execute"函数来调用实际操作。

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

3.定义两个具体的Command实现,用于打开和关闭灯光。

class Switch_on_Command: public Command {
public:
    Switch_on_Command(Receiver *r) {
        receiver = r;
    }

    void execute() {
        receiver->switch_on();
    }

private:
    Receiver *receiver;
};

class Switch_off_Command: public Command {
public:
    Switch_off_Command(Receiver *r) {
        receiver = r;
    }

    void execute() {
        receiver->switch_off();
    }

private:
    Receiver *receiver;
};

4.定义Invoker类,它可以包含一个Command对象,并调用其中的"execute"函数。

class Invoker {
public:
    Invoker(Command *c) {
        cmd = c;
    }

    void execute() {
        cmd->execute();
    }

private:
    Command *cmd;
};

5.定义Client类,它将Receiver、Command和Invoker组合在一起。

int main() {
    Receiver *r = new Receiver();
    Switch_on_Command *switch_on_command = new Switch_on_Command(r);
    Switch_off_Command *switch_off_command = new Switch_off_Command(r);

    Invoker *invoker_for_switch_on_command = new Invoker(switch_on_command);
    Invoker *invoker_for_switch_off_command = new Invoker(switch_off_command);

    invoker_for_switch_on_command->execute();
    invoker_for_switch_off_command->execute();

    return 0;
}

运行程序后,将输出以下内容:

Light switched on!
Light switched off!

另一个Command模式的示例

下面是一个更有趣的示例,该示例使用Command模式在电视机上切换频道:

实现步骤

1.定义包含"channel_up"和"channel_down" 函数的电视机类。

class TV {
public:
    void channel_up() {
        cout << "Channel up!" << endl;
    }

    void channel_down() {
        cout << "Channel down!" << endl;
    }
};

2.定义Command类,使用其中的"execute"函数来调用实际操作。

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

3.定义两个具体的Command实现,用于打开和关闭灯光。

class Channel_up_Command: public Command {
public:
    Channel_up_Command(TV *tv) {
        tv_object = tv;
    }

    void execute() {
        tv_object->channel_up();
    }

private:
    TV *tv_object;
};

class Channel_down_Command: public Command {
public:
    Channel_down_Command(TV *tv) {
        tv_object = tv;
    }

    void execute() {
        tv_object->channel_down();
    }

private:
    TV *tv_object;
};

4.定义Invoker类,它可以包含一个Command对象,并调用其中的"execute"函数。

class Invoker {
public:
    Invoker(Command *c) {
        cmd = c;
    }

    void execute() {
        cmd->execute();
    }

private:
    Command *cmd;
};

5.定义Client类,它将TV、Command和Invoker组合在一起。

int main() {
    TV *tv = new TV();
    Channel_up_Command *channel_up_command = new Channel_up_Command(tv);
    Channel_down_Command *channel_down_command = new Channel_down_Command(tv);

    Invoker *invoker_for_channel_up_command = new Invoker(channel_up_command);
    Invoker *invoker_for_channel_down_command = new Invoker(channel_down_command);

    invoker_for_channel_up_command->execute();
    invoker_for_channel_down_command->execute();

    return 0;
}

运行程序后,将输出以下内容:

Channel up!
Channel down!

总结

Command模式提供了一种旨在将请求封装成一个对象的方法,从而支持日志记录、队列和撤销操作。它优雅地解决了解决了用obj.method()的实现方式,将程序中的行为抽象出来。Command模式几乎是任何面向对象编程语言的必备技能,可以大大提高您的代码能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解设计模式中的Command命令模式及相关C++实现 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • c++实现值机系统

    C++实现值机系统攻略 1. 确定需求 在实现值机系统之前,我们需要确定需求,具体包括以下几个方面: 登记航班信息,包括航班号、起飞时间、到达时间、起飞机场、到达机场、预计飞行时间等。 登记乘客信息,包括乘客姓名、证件类型、证件号码、航班号、座位号等。 实现在线值机功能,可以选择座位、打印登机牌等。 实现退改签功能,可以修改预定信息或取消预定。 实现管理员功…

    C 2023年5月23日
    00
  • C++哈希应用之位图,哈希切分与布隆过滤器详解

    C++哈希应用之位图,哈希切分与布隆过滤器详解 前言 哈希是一种常用的数据结构技术,它的应用很广泛。在一些场景下,我们需要快速地判断某个元素是否在一个集合中,而哈希刚好可以满足这个需求。本文将详细讲解C++哈希应用之位图、哈希切分与布隆过滤器。 位图 位图是一种基于二进制的数据结构。在计算机中,我们通常用一个字节(Byte)表示8个二进制位(Bit)。因此,…

    C 2023年5月23日
    00
  • Linux编译优化必须掌握的几个姿势总结

    下面我会详细讲解“Linux编译优化必须掌握的几个姿势总结”的完整攻略,过程中会包含两条示例说明。 Linux编译优化必须掌握的几个姿势总结 1. 选择正确的编译器 选择合适的编译器对于提升程序的性能至关重要。在编译器选择时,除了考虑编译速度,还应该考虑编译出来的程序的运行速度。常见的编译器有gcc、clang等,其中gcc是一个较为传统的编译器,并且它支持…

    C 2023年5月23日
    00
  • C++实现扫雷、排雷小游戏

    C++实现扫雷、排雷小游戏攻略 游戏介绍 扫雷是一种单人益智游戏,目标是在一个方块网格中排雷,并尽可能快的完成游戏。游戏规则如下: 在一个大小为M * N的矩阵中,有一些地雷分布在矩阵中,其他方块是空白的 玩家可以翻开其中一个空白方块,如果该方块旁边有雷,则游戏失败,否则该方块会显示周围的雷数 如果翻开的方块周围没有雷,则该方块的周围的方块也会被翻开,直到所…

    C 2023年5月24日
    00
  • json实现jsp分页实例介绍(附效果图)

    下面就来详细讲解一下“json实现jsp分页实例介绍(附效果图)”的完整攻略。 1. 基本介绍 这个示例主要是基于jsp和json技术实现的分页功能。通过jsp实现数据的展示以及分页的管理,通过json来实现前后台数据的交互,即ajax异步刷新数据,实现页面的无刷新分页。 2. 具体步骤 2.1 实现数据的获取和展示 首先,我们需要在jsp页面中实现数据的获…

    C 2023年5月23日
    00
  • C语言中pthread_exit()函数实现终止线程

    下面是详细讲解“C语言中pthread_exit()函数实现终止线程”的完整攻略: 1. pthread_exit()函数概述 在C语言中,使用pthread库实现多线程编程时,我们可以通过pthread_exit()函数来实现线程的终止。pthread_exit函数可以终止一个线程并返回一个值给thread_join函数。这个返回值可以在主线程中通过调用t…

    C 2023年5月22日
    00
  • x86汇编DOS编程环境搭建过程

    搭建x86汇编DOS编程环境 1.安装DOSBox DOSBox是一个模拟DOS环境的开源软件,可以在现代操作系统上运行DOS程序。我们可以利用其模拟DOS环境来进行汇编语言程序的编写和调试。 在DOSBox官网上下载适用于你所使用操作系统的DOSBox并安装。 2.下载并安装x86汇编编译器 这里将介绍NASM。 下载NASM:http://www.nas…

    C 2023年5月23日
    00
  • python 中if else 语句的作用及示例代码

    当我们需要根据某个条件来执行不同的代码,就需要使用到if else语句。if else语句在Python中非常常见且非常重要,其基本结构如下: if 条件: # 条件成立时要执行的代码块 else: # 条件不成立时要执行的代码块 其中,条件可为任何可以转换成布尔值True或者False的表达式,如比较运算符(>、<、==、!=等)、逻辑运算符(…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部