详解设计模式中的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. 扫雷游戏规则 扫雷游戏是一款经典的单人益智类游戏,游戏的目标是在没有触雷的情况下,揭示所有不是地雷的格子。游戏中有三种类型的格子:未揭开的安全格子、未揭开的地雷格子和已揭开的数字格子。在游戏开始时,玩家需要根据每次揭开的数字格子来推测哪些格子是地雷,最终揭开所有不是地雷的格子即可胜利。 2. 游戏实现…

    C 2023年5月24日
    00
  • 关于C语言中数据在内存中的存储详解

    关于C语言中数据在内存中的存储详解 C语言是一种底层语言,它的代码直接被编译为机器语言,而在C语言中,数据的存储方式非常重要,因为它将直接影响程序的性能和可靠性。 数据类型的存储方式 在C语言中,不同的数据类型会占用不同的内存空间,通常来说,一个字节(byte)等于八个位(bit)。下面是一些常见数据类型占用的内存空间。 char: 一个字节 short: …

    C 2023年5月23日
    00
  • C语言实现井字棋详解

    C语言实现井字棋详解 前言 本文主要讲解如何用 C 语言实现一个简单的井字棋游戏,旨在帮助初学者掌握 C 语言基础知识。 游戏规则 井字棋,也称为三连棋,是一个两人对弈的纸笔游戏。游戏开始前,一方用 “X”,另一方用 “O”,轮流在 3×3 的九宫格上落子,先将自己的棋子横、竖、斜地连成一条线者获胜。 实现思路 我们可以将井字棋游戏的实现分为以下几个步骤: …

    C 2023年5月23日
    00
  • C语言 switch-case语句

    以下是C语言 switch-case语句的完整使用攻略: 什么是switch-case语句? C语言中的switch-case语句是一种用于多分支条件判断的语句,它可以根据不同的取值来执行不同的代码块。switch语句会根据一个表达式的值与case关键字后面的值进行匹配,如果匹配成功,则会执行与之对应的代码块。当匹配失败时,可以使用default关键字来执行…

    C 2023年5月9日
    00
  • 在golang xorm中使用postgresql的json,array类型的操作

    在golang xorm中使用postgresql的json,array类型的操作可以通过以下步骤完成: 1. 声明结构体并设置相关参数 type User struct { Id int64 `xorm:"pk autoincr"` Name string `xorm:"varchar(25) notnull"` A…

    C 2023年5月23日
    00
  • C++内存管理详细解析

    C++内存管理详细解析攻略 C++是一门广泛使用的高级编程语言,内存管理是C++程序设计中的重要内容。C++内存管理涉及到内存的分配、使用和释放。本文将对C++内存管理进行详细解析,并提供两个代码示例作为补充。 堆栈内存分配方式 C++内存主要有两种分配方式,分别是堆内存和栈内存。堆内存由程序员手动分配和释放,而栈内存由系统自动分配和释放。 堆内存 程序员手…

    C 2023年5月23日
    00
  • CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    请参照以下攻略: CLion搭建配置C++开发环境的图文教程 一、下载CLion 访问CLion官网,下载适合自己操作系统的二进制安装包。 二、安装MinGW-W64 GCC 访问MinGW官网,下载适合自己操作系统的MinGW-W64 GCC安装包。选择安装包的时候,需要注意选择合适的安装路径。完成下载后点击安装包,选择“Add to PATH”选项。 三…

    C 2023年5月23日
    00
  • python中常用的各种数据库操作模块和连接实例

    连接数据库是Python中非常重要的操作之一。Python中有很多数据库操作模块,比如官方的sqlite3模块,以及第三方的MySQLdb和pymongo等模块。下面就对这些模块及其使用做一个详细的介绍和示例说明。 sqlite3模块 官方sqlite3模块是Python内置的模块,它可以通过Python与SQLite数据库进行交互。它允许我们执行SQL语句…

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