【软件设计模式之命令模式】

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

一、命令模式简介

命令模式是一种行为设计模式,它在软件开发中扮演着特殊的角色,尤其是在处理操作请求、排队请求、记录日志,以及支持可撤销操作方面。

1. 定义

命令模式将请求封装成对象,从而允许使用者与接收者解耦,使用不同的请求、队列或日志来参数化其他对象。它也支持可撤销操作。简单来说,命令模式把一个请求或简单操作封装到一个对象中。

在命令模式中,这个封装包含了所有必要的信息,这可能包括调用方法的名称、拥有该方法的对象、方法参数的值等。

2. 核心概念

a. 命令(Command)

命令对象为所有命令声明一个接口。在最简单的形式中,这个接口包含了一个执行操作的方法。命令对象知道接收者是谁以及执行哪些操作。

b. 接收者(Receiver)

接收者是命令操作的对象。它知道如何执行与请求相关的操作。任何类都可以作为接收者。

c. 调用者(Invoker)

调用者持有一个命令对象,并在某一时间点调用命令对象的执行方法,以发送请求。调用者不需要知道请求是如何执行的,也不知道操作的具体细节。

d. 客户端(Client)

客户端负责创建一个具体的命令,并设置其接收者。客户端可以决定哪些命令执行何时执行。

二、命令模式的实际应用

1. 命令模式的优点

a. 解耦发起者和执行者

命令模式最显著的好处是将发起请求的对象(调用者)与执行请求的对象(接收者)解耦。这种分离使得调用者不需要知道请求的具体实现细节。

b. 易于扩展

命令模式允许轻松地添加新命令,因为新增命令只需实现一个接口。这有助于遵循开闭原则,即软件实体应该对扩展开放,对修改关闭。

c. 组合命令

可以组合多个命令,实现复杂的功能。例如,可以实现宏命令,这是一种复合命令,它包含多个子命令。

d. 支持撤销操作

由于每个操作都被封装在命令对象中,可以很方便地实现撤销(undo)和重做(redo)功能。

e. 可以实现请求的排队和日志记录

命令可以排队执行,也可以记录日志,有助于实现事务功能,如对失败的操作进行回滚。

2. 命令模式的缺点

a. 可能导致类数量增多

每个新命令可能都需要创建一个新类,随着应用程序中命令数量的增加,会增加系统的复杂性。

b. 增加代码量和复杂性

对于一些简单的操作,使用命令模式可能会让代码变得不必要地复杂,增加代码量。

3. 适用场景

a. 需要参数化和延迟执行操作时

当需要将操作封装成对象,以便将其传递、存储或操作时,命令模式非常适用。

b. 支持撤销和重做操作

在需要提供撤销和重做功能的场景中,如文本编辑器或IDE中的操作,命令模式非常有用。

c. 需要实现操作的日志记录和恢复功能

在需要记录操作历史以便后续恢复或重放操作的系统中,命令模式是一个理想的选择。

d. 需要处理事务

在需要创建复杂的事务系统,如需要维护操作顺序和状态的数据库管理系统中,命令模式可以帮助实现事务的回滚机制。

三、命令模式的实现

命令模式的实现涉及到定义命令接口、创建具体命令类、定义接收者和调用者。

1. 代码示例

一个简单的文本编辑器应用,实现一个文本添加和撤销的功能。

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

// 命令接口
class Command {
public:
    virtual ~Command() {}
    virtual void Execute() = 0;
    virtual void Undo() = 0;
};

// 接收者类
class TextEditor {
    std::string text;
public:
    void addText(const std::string& newText) {
        text += newText;
    }
    void removeText(size_t length) {
        text.erase(text.size() - length);
    }
    void showText() {
        std::cout << text << std::endl;
    }
};

// 具体命令类
class AddTextCommand : public Command {
    TextEditor& editor;
    std::string textToAdd;
public:
    AddTextCommand(TextEditor& editor, const std::string& text) : editor(editor), textToAdd(text) {}
    void Execute() override {
        editor.addText(textToAdd);
    }
    void Undo() override {
        editor.removeText(textToAdd.length());
    }
};

// 调用者类
class CommandInvoker {
    std::vector<std::shared_ptr<Command>> history;
public:
    void executeCommand(std::shared_ptr<Command> command) {
        command->Execute();
        history.push_back(command);
    }
    void undo() {
        if (!history.empty()) {
            history.back()->Undo();
            history.pop_back();
        }
    }
};

int main() {
    TextEditor editor;
    CommandInvoker invoker;

    invoker.executeCommand(std::make_shared<AddTextCommand>(editor, "Hello"));
    invoker.executeCommand(std::make_shared<AddTextCommand>(editor, " World"));

    editor.showText(); // 输出: Hello World

    invoker.undo();
    editor.showText(); // 输出: Hello

    invoker.undo();
    editor.showText(); // 输出: (空)

    return 0;
}

2. 实现步骤

a. 定义命令接口

首先,创建一个命令接口(Command),定义执行和撤销命令的方法。

b. 创建具体命令类

然后,为每个具体的动作实现一个命令类(如AddTextCommand),这些类继承自命令接口并实现相应的方法。

c. 定义接收者

接收者是命令执行的对象(如TextEditor),它知道如何实际执行命令。

d. 实现调用者

调用者(如CommandInvoker)负责调用命令的执行方法,并可以存储历史记录,用于实现撤销功能。

3. 案例分析

通过AddTextCommand,用户可以向文本编辑器中添加文本。编辑器的状态可以通过调用命令的Undo方法来回退。在更复杂的应用中,可以扩展这种模式来实现更多复杂的命令和功能,如复制、粘贴、删除等。

四、命令模式与其他设计模式的比较

1. 命令模式与策略模式

a. 相似点

  • 封装行为:两者都涉及到将行为封装在对象中。
  • 可交换性:在这两种模式中,可以动态地改变对象所封装的行为。

b. 不同点

  • 目的和用途

    • 命令模式:重点在于分离发起命令的对象(调用者)和接收命令的对象(接收者)。它允许将命令封装为对象以进行存储、传递和执行。
    • 策略模式:侧重于使算法的变体可以互换使用。它允许根据上下文更改对象的行为,而不是通过封装命令和请求。
  • 实现方式

    • 命令模式中,调用者通常不知道命令具体实施的操作,只是知道如何发出命令。
    • 策略模式中,上下文类知道哪个策略正在使用,并直接使用它来完成其任务。

2. 命令模式与观察者模式

a. 相似点

  • 解耦:两者都有助于解耦对象,使得发起动作的对象不必关心接收动作的对象。

b. 不同点

  • 通信机制

    • 命令模式:强调在对象之间传递封装有操作细节的命令对象。命令模式更多地关注于操作和它的发送者和接收者。
    • 观察者模式:定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式更多地用于事件处理和通知机制。
  • 使用场景文章来源地址https://www.toymoban.com/news/detail-827710.html

    • 使用命令模式,当需要将请求或简单操作封装到对象中,以参数化其他对象,实现撤销操作或者将请求放入队列中处理时。
    • 使用观察者模式,当一个状态的改变需要自动通知一个或多个对象,并且对象间的这种交互是松散耦合的时。

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

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

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

相关文章

  • 软件设计模式与体系结构-设计模式-行为型软件设计模式-中介者模式

    模式动机: 为了减少对象两之间复杂的引用关系,使之成为一个松耦合的系统,需要适用中介者模式 定义: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使耦合松散,而且可以独立地该变它们之间的交互 中介者模式又称为调停者模

    2024年02月12日
    浏览(29)
  • 设计模式行为模式-命令模式

    命令模式(Command Pattern)是一种行为型设计模式,用于将请求封装为对象,从而使你可以使用不同的请求、队列或者日志请求来参数化其他对象。这样可以实现请求的参数化操作、队列化和日志化,且能够支持撤销操作。 命令模式由以下几个核心组件组成: 命令(Command)

    2024年02月10日
    浏览(33)
  • 软件设计模式之原型模式

    原型模式(Prototype Pattern)的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常地多,其定义如下: Specify the kinds of objects to create using a prototypical instance, and create new objects by copyingthis prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新

    2024年02月09日
    浏览(35)
  • 设计模式(19)命令模式

    一、介绍: 1、定义:命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组成结构: (1)命令接口(Command):定义执行命令的方法,可

    2024年02月07日
    浏览(28)
  • 设计模式——命令模式

    将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式是一个高内聚的模式。 优点 类间解耦。调用者与接收者之间没有任何依赖关系。调用者只需要调用execute()方法即可,不需要了

    2024年02月15日
    浏览(29)
  • 设计模式-命令模式

    接受者(Receiver) 请求的实际作用对象 抽象命令(Command) 声明了执行请求的execute方法 具体命令(ConcreteCommand) 调用实际操作对象,实现execute 调用者(Invoker) 调用命令请求发送者 功能键绑定 比如遥控器的功能键,现在想要实现为功能可以自定义绑定事件,请使用命令模

    2024年02月09日
    浏览(31)
  • 设计模式:命令模式

    命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 定义 命令模式包括以下主要角色: Command :命令接口,声明执行操作的方法。 ConcreteCommand :具

    2024年04月16日
    浏览(32)
  • 【设计模式】命令模式

    【设计模式】命令模式——行为型模式 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。 命令模式包含以下主要角色: 抽象命令类(Command)角

    2024年02月03日
    浏览(28)
  • 设计模式之命令模式

    定义: 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 目的: 将一个请求封装成一个对象,从而使您

    2024年02月20日
    浏览(35)
  • 软件设计原则与设计模式

    设计中各各原则同时兼有或冲突,不存在包含所有原则的设计 一:单一职责原则又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合) 描述:类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联。 二:开闭

    2024年02月10日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包