C++ 设计模式之命令模式

这篇具有很好参考价值的文章主要介绍了C++ 设计模式之命令模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【声明】本题目来源于卡码网(题目页面 (kamacoder.com))

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】


【设计模式大纲】

C++ 设计模式之命令模式,c++,设计模式,开发语言,命令模式,java


 文章来源地址https://www.toymoban.com/news/detail-802930.html

【简介】

        -- 什么是命令模式 (第15种模式)

        命令模式是⼀种⾏为型设计模式,其允许将请求封装成⼀个对象(命令对象,包含执⾏操作所需的所有信息),并将命令对象按照⼀定的顺序存储在队列中,然后再逐⼀调用执⾏,这些命令也可以⽀持反向操作,进⾏撤销和重做
        这样⼀来,发送者只需要触发命令就可以完成操作,不需要知道接受者的具体操作,从⽽实现两者间的解耦
        举个现实中的应⽤场景,遥控器可以控制不同的设备,在命令模式中,可以假定每个按钮都是⼀个命令对象,包含执⾏特定操作的命令,不同设备对同⼀命令的具体操作也不同,这样就可以⽅便的添加设备和命令对象。


【基本结构】

命令模式包含以下⼏个基本⻆⾊:

  • 命令接⼝Command :接⼝或者抽象类,定义执⾏操作的接⼝。
  • 具体命令类ConcreteCommand : 实现命令接⼝,执⾏具体操作,在调⽤execute ⽅法时使“接收者对象”根据命令完成具体的任务,⽐如遥控器中的“开机”,“关机”命令。
  • 接收者类Receiver : 接受并执⾏命令的对象,可以是任何对象,遥控器可以控制空调,也可以控制电视机,电视机和空调负责执⾏具体操作,是接收者。
  • 调⽤者类Invoker : 发起请求的对象,有⼀个将命令作为参数传递的⽅法。它不关⼼命令的具体实现,只负责调⽤命令对象的 execute() ⽅法来传递请求,在本例中,控制遥控器的“⼈”就是调⽤者。
  • 客户端:创建具体的命令对象和接收者对象,然后将它们组装起来。

 C++ 设计模式之命令模式,c++,设计模式,开发语言,命令模式,java


 【简易实现】

        以Java代码先作以说明:

1. 定义执⾏操作的接⼝:包含⼀个execute ⽅法。有的时候还会包括unExecute ⽅法,表示撤销命令。

public interface Command {
    void execute();
}

 2. 定义接受者类,知道如何实施与执⾏⼀个请求相关的操作。

public class Receiver {
    public void action() {
        // 执⾏操作
    }
}

3. 实现命令接⼝,执⾏具体的操作。

public class ConcreteCommand implements Command {
    // 接收者对象
    private Receiver receiver;
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        // 调⽤接收者相应的操作
    receiver.action();
    }
}

4.

(1)定义调用者类,调⽤命令对象执⾏请求。

public class Invoker {
    private Command command;
    public Invoker(Command command) {
        this.command = command;
    }
    public void executeCommand() {
        command.execute();
    }
}

(2)调⽤者类中可以维护⼀个命令队列或者“撤销栈”,以⽀持批处理和撤销命令。

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file CommandMode
* @brief 命令模式
* @autor 写代码的小恐龙er
* @date 2024/01/17
*/

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
// 调⽤者类:命令队列和撤销请求
class Invoker {
    private Queue<Command> commandQueue; // 命令队列
    private Stack<Command> undoStack; // 撤销栈
    public Invoker() {
        this.commandQueue = new LinkedList<>();
        this.undoStack = new Stack<>();
    }
    // 设置命令并执⾏
    public void setAndExecuteCommand(Command command) {
        command.execute();
        commandQueue.offer(command);
        undoStack.push(command);
    }
    // 撤销上⼀个命令
    public void undoLastCommand() {
        if (!undoStack.isEmpty()) {
        Command lastCommand = undoStack.pop();
        lastCommand.undo(); // 需要命令类实现 undo ⽅法
        commandQueue.remove(lastCommand);
        } else {
            System.out.println("No command to undo.");
        }
    }
    // 执⾏命令队列中的所有命令
    public void executeCommandsInQueue() {
        for (Command command : commandQueue) {
        command.execute();
        }
    }
}

5.客户端使用,创建具体的命令对象和接收者对象,然后进⾏组装。
 

public class Main {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);
        invoker.executeCommand();
    }
}

【优缺点和使用场景】

        命令模式在需要将请求封装成对象、⽀持撤销和重做、设计命令队列等情况下,都是⼀个有效的设计模式。

  • 撤销操作: 需要⽀持撤销操作,命令模式可以存储历史命令,轻松实现撤销功能。
  • 队列请求: 命令模式可以将请求排队,形成⼀个命令队列,依次执⾏命令。
  • 可扩展性: 可以很容易地添加新的命令类和接收者类,而不影响现有的代码。新增命令不需要修改现有代码,符合开闭原则

        但是对于每个命令,都会有⼀个具体命令类,这可能导致类的数量急剧增加,增加了系统的复杂性。
        命令模式同样有着很多现实场景的应用,⽐如Git中的很多操作,如提交(commit)、合并(merge)等,都可以看作是命令模式的应⽤,用户通过执⾏相应的命令来操作版本库。Java的GUI编程中,很多事件处理机制也都使⽤了命令模式。例如,每个按钮都有⼀个关联的 Action ,它代表⼀个命令,按钮的点击触发 Action 的执⾏。


【C++编码部分】

1. 题目描述

        小明去奶茶店买奶茶,他可以通过在自助点餐机上来点不同的饮品,请你使用命令模式设计一个程序,模拟这个自助点餐系统的功能。

2. 输入描述

  • 第一行是一个整数 n(1 ≤ n ≤ 100),表示点单的数量。
  • 接下来的 n 行,每行包含一个字符串,表示点餐的饮品名称。

3. 输出描述

        输出执行完所有点单后的制作情况,每行输出一种饮品的制作情况。如果制作完成,输出 "XXX is ready!",其中 XXX 表示饮品名称。

4. C++编码实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file CommandMode.hpp
* @brief 命令模式
* @autor 写代码的小恐龙er
* @date 2024/01/17
*/

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

using namespace std;

// 前置声明

// 命令接口类
class Command;
// 具体命令类 -- 点餐命令
class OrderCommand;
// 接收者类
class DrinkMaker;
// 调用者类
class OrderMachine;

// 实现
// 1. 命令接口类
class Command
{
public:
    // 接口函数
    virtual void Execute() = 0;
};

// 2. 接收者类
class DrinkMaker {
// 成员函数
public:
    void makeDrink(string drinkName) {
        std::cout << drinkName << " is ready!" << endl;
    }
};

// 3. 具体命令类 -- 点餐命令
class OrderCommand : public Command
{
// 成员数据
private:
    string _drinkNmae;
    DrinkMaker *_receiver;
// 成员函数
public:
    // 构造函数
    OrderCommand(string drinkNmae, DrinkMaker *receiver){
        this->_drinkNmae = drinkNmae;
        this->_receiver = receiver;
    }
    // 重载命令执行函数
    void Execute() override{
        _receiver->makeDrink(_drinkNmae);
    }
};

// 4. 调用者类
class OrderMachine
{
// 成员数据
private:
    // 调用的命令基类
    Command *_command;
// 成员函数
public:
    OrderMachine(Command *command){
        this->_command = command;
    }
    // 调用命令的执行
    void ExecuteOrder(){
        if(_command != nullptr){
            _command->Execute();
        }
        return;
    }
};

// 客户端
int main()
{
    // 点单数量
    int orderNum = 0;
    std::cin >> orderNum;
    
    // 创建命令基类
    Command *command = nullptr;
    // 创建调用者类  后续进行堆区赋值
    OrderMachine *orderMachine = nullptr;
    // 创建接收者类
    DrinkMaker *drinkMaker = new DrinkMaker();
    // 遍历
    for(int i = 0; i < orderNum; i++){
        // 饮品名称
        string name;
        std::cin >> name;
        
        // 构造类
        command = new OrderCommand(name, drinkMaker);
        orderMachine = new OrderMachine(command);
        
        // 执行命令
        orderMachine->ExecuteOrder();
    }
    
    // 析构
    delete drinkMaker;
    drinkMaker = nullptr;
    
    if(command != nullptr){
        delete command;
        command = nullptr;
    }
    
    if(orderMachine != nullptr){
        delete orderMachine;
        orderMachine = nullptr;
    }
    return 0;
}



......

To be continued.

 

到了这里,关于C++ 设计模式之命令模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 设计模式——命令模式

    (1)日常生活中,我们出去吃饭都会遇到下面的场景: (2)命令模式是一种行为型设计模式, 它通过将请求封装为一个对象,使得可以灵活地参数化客户端对象,同时也能够将请求队列或记录日志、撤销操作等操作进行处理 。命令模式的作用在于 解耦请求发送者和接收者

    2024年02月06日
    浏览(34)
  • 03-JAVA设计模式-命令模式

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可用不同的请求把客户端与请求的处理者解耦,也称动作模式或事物模式。 在命令模式中,命令对象封装了接收者对象的动作,调用者通过调用命令对象来执行该动作,而无需知道具体的接收者对

    2024年04月27日
    浏览(33)
  • java设计模式之命令设计模式的前世今生

    命令设计模式是什么? 命令设计模式是一种行为型设计模式,它允许将请求封装为对象,并将其传递给调用者,从而使调用者可以在不知道请求具体细节的情况下进行操作。命令模式的主要目的是解耦请求的发送者和接收者,以及通过发送者和接收者之间的解耦,增强系统的

    2024年02月06日
    浏览(60)
  • 【Java 设计模式】行为型之命令模式

    命令模式(Command Pattern)是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。在本文中,我们将深入研究Java中命令模式的定义、结构、使用场景以及如何在实际开发中应用。 命令模式是一种行为型设

    2024年01月23日
    浏览(42)
  • Java设计模式之行为型-命令模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、点餐案例  五、总结 1、将一个请求封装为一个对象,使您可以用不同的请求对客户进行参数化。 2、对请求排队或记录请求日志,以及支持可撤销的操作。 3、将命令对象与执行命令的对象分离,

    2024年02月16日
    浏览(36)
  • Java 设计者模式以及与Spring关系(七) 命令和迭代器模式

    本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。 23设计者模式以及重点模式 我们都知道 设计者模式 有 3 类 23 种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。 (1)创建

    2024年01月24日
    浏览(35)
  • 【Java开发】设计模式 17:中介者模式

    中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互。 中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在这个模式中,中介者负责协调各个对象间的通信,使其流程更加清晰简单。 📌  场景 中介者

    2023年04月22日
    浏览(46)
  • 从C语言到C++_37(特殊类设计和C++类型转换)单例模式

    目录 1. 特殊类设计 1.1 不能被拷贝的类 1.2 只能在堆上创建的类 1.3 只能在栈上创建的类 1.4 不能被继承的类 1.5 只能创建一个对象的类(单例模式)(重点) 1.5.1 饿汉模式 1.5.2 懒汉模式 2. 类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3. RTTI(了解)和类型转换常见面

    2024年02月10日
    浏览(49)
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现

    单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。 当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式

    2023年04月27日
    浏览(90)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包