命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

这篇具有很好参考价值的文章主要介绍了命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

        命令设计模式(Command Pattern)是一种行为设计模式,它将请求的操作封装为一个对象,从而实现请求者和执行者之间的解耦。这样,请求者只需要知道如何发送请求,而无需关心请求的具体执行过程。命令模式在很多场景下都非常有用,例如撤销操作、延迟执行、记录操作日志等。

组成角色

  1. 抽象命令(Command):定义命令的接口,通常包含一个名为execute()的方法。
  2. 具体命令(ConcreteCommand):实现抽象命令接口,封装具体的操作逻辑。
  3. 请求者(Invoker):负责调用命令对象来执行请求,通常不需要知道命令的具体实现。
  4. 接收者(Receiver):负责执行具体的操作,通常是一个具体的类或对象。

相关图示

命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

示例代码

// 抽象命令
interface Command {
    void execute();
}

// 具体命令
class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }
}

// 接收者
class Receiver {
    void action() {
        System.out.println("执行具体操作");
    }
}

// 请求者
class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void invoke() {
        command.execute();
    }
}

// 客户端代码
public class CommandPatternDemo {
    public static void main(String[] args) {
      
      //**在这个示例中,我们定义了一个抽象命令Command接口和一个具体命令ConcreteCommand类。具体命令封装了接收者Receiver的操作逻辑。请求者Invoker负责调用命令对象来执行请求。客户端代码创建了接收者、具体命令和请求者,并通过调用请求者的invoke()方法来执行请求。这样,请求者和接收者之间实现了解耦,使得代码更加灵活、易于维护。**/
      	
        // 创建接收者
        Receiver receiver = new Receiver();
        // 创建具体命令
        Command command = new ConcreteCommand(receiver);
        // 创建请求者
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        // 执行请求
        invoker.invoke();
    }
}

框架中的运用

在Dubbo框架中,命令模式被用于处理网络通信中的请求和响应。下面是相关流程中的简版代码

1、org.apache.dubbo.remoting.exchange.ExchangeChannel接口。这是Dubbo通信层中的一个关键接口,它代表了一个通信通道。其中,request(Object request)方法用于发送请求,而send(Object message)方法用于发送响应:

public interface ExchangeChannel extends Channel {
    CompletableFuture<Object> request(Object request) throws RemotingException;
    CompletableFuture<Object> request(Object request, int timeout) throws RemotingException;
    void send(Object message) throws RemotingException;
		// 省略部分代码...
}

2、当通道收到一个请求或响应时,它会将其封装为org.apache.dubbo.remoting.exchange.Requestorg.apache.dubbo.remoting.exchange.Response对象。这两个类分别表示请求和响应,其中Request类包含请求的数据以及请求的ID,而Response类包含响应的数据、状态以及请求的ID:

public class Request {
    private final long id;
    private String version;
    private boolean twoWay = true;
    private boolean event = false;
    private Object data;
     // 省略部分代码...
}

public class Response {
    private final long id;
    private String version;
    private int status;
    private boolean event = false;
    private Object result;
    private Throwable exception;
    // 省略部分代码...
}

3、在通信层,有一个org.apache.dubbo.remoting.Dispatcher接口,它负责分发请求和响应。分发器会将收到的请求和响应封装为ChannelHandler对象,并调用相应的方法进行处理。例如,当分发器收到一个请求时,它会调用ChannelHandlerreceived(Channel channel, Object message)方法进行处理:

public interface ChannelHandler {
    void connected(Channel channel) throws RemotingException;
    void disconnected(Channel channel) throws RemotingException;
    void sent(Channel channel, Object message) throws RemotingException;
    void received(Channel channel, Object message) throws RemotingException;
    void caught(Channel channel, Throwable exception) throws RemotingException;
}

4、对于请求的处理,通常会使用org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler类。这个类实现了ChannelHandler接口,并重写了received(Channel channel, Object message)方法。在这个方法中,它首先判断收到的消息是否为Request对象,然后根据请求的类型(如普通请求、心跳请求等)进行相应的处理:文章来源地址https://www.toymoban.com/news/detail-428078.html

public class HeaderExchangeHandler implements ChannelHandlerDelegate {
  	
  //展示相关代码
  @Override
  public void received(Channel channel, Object message) throws RemotingException {
      if (message instanceof Request) {
					//省略部分代码
          // 处理请求
          handleRequest(channel, (Request) message);
      } else if (message instanceof Response) {
          // 处理响应
          handleResponse(channel, (Response) message);
      } else {
					//省略部分代码
          // 对于其他类型的消息,调用父类的方法进行处理
          handler.received(channel, message);
      }
  }
  
 

}

适用场景

  1. 请求调用者与请求接收者需要解耦:命令模式将调用操作的对象与知道如何实现这些操作的对象分离开来,这有助于降低系统各部分之间的耦合。
  2. 需要抽象出待执行的操作以参数化其他对象:命令模式可以将请求封装为具体的命令对象,这些对象可以在运行时进行传递、组合和替换,实现了更高程度的灵活性。
  3. 需要支持撤销操作:命令模式可以在命令接口中添加一个名为undo的方法,以便在需要时撤销操作。具体命令类可以保存先前的状态,以便在执行undo方法时能够恢复原始状态。
  4. 需要支持宏命令:命令模式允许将多个命令组合成一个宏命令对象,即一个命令序列。这个宏命令对象可以像单个命令一样被执行,从而实现对一组命令的统一管理。
  5. 需要将命令放入队列中进行排队执行:命令模式可以将命令对象放入队列中,然后逐个执行这些命令。这可以帮助实现后台任务队列、工作线程池等功能。
  6. 需要记录命令日志:命令模式可以用于记录命令的详细信息,这有助于实现日志记录、审计、事务等功能。

到了这里,关于命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【设计模式|行为型】命令模式(Command Pattern)

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立,并且可以用不同的请求对客户端进行参数化。 结构 命令接口

    2024年02月15日
    浏览(36)
  • 23种设计模式之命令模式(Command Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的命令模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞

    2024年02月06日
    浏览(38)
  • C#设计模式(15)命令模式(Command Pattern)

    命令模式(Command Pattern) 命令模式是一种数据驱动的设计模式,属于行为型模式类别。请求被包装在一个对象中作为命令,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并将命令传递给相应的对象,该对象执行命令。 实现 步骤 1 :创建一个命令接口。 步骤

    2024年02月14日
    浏览(37)
  • 命令模式 Command Pattern 《游戏设计模式》学习笔记

    对于一般的按键输入,我们通常这么做,直接if按了什么键,就执行相应的操作 在这里我们是将用户的输入和程序行为硬编码在一起,这是我们很自然就想到的最快的做法。 但是如果这是一个大型游戏,往往我们需要实现一个按键配置的功能(话说2077直到上线都没有实现这

    2024年02月14日
    浏览(41)
  • 设计模式——命令模式(Command Pattern)+ Spring相关源码

    类型: 行为型模式 目的: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 2.1.1 定义命令类接口 2.1.2 定义命令执行者 2.1.3 被处理对象Stock。 菜鸟教程定义 被处理的对象 是Stock。 2.1.4 封装处理Stock的命令 虽然 Runnable 接口本身并不是一个命令模式

    2024年02月06日
    浏览(38)
  • 设计模式-命令模式(Command)

    命令模式(Command Pattern)是一种行为型设计模式,也被称为动作模式或事务模式。它的核心思想是将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。对请求排队或记录,以及支持可撤销的操作。命令模式的主要目的是将发出请求的对象和执行请求的

    2024年04月27日
    浏览(31)
  • 说说设计模式~命令模式(command)

    回到目录 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而允许我们根据不同的请求将客户端参数化,并且能够将请求排队或记录请求日志、支持撤销操作等。该模式使得请求的发送者和接收者解耦。 使用命令模式的主要目的是将方法调用封

    2024年02月11日
    浏览(43)
  • 设计模式之命令模式(Command)的C++实现

    在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”,如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。 有2两种不同

    2024年02月10日
    浏览(36)
  • C++设计模式_23_Command 命令模式

    我们将Command 和Visitor归为“行为变化”模式。 Command 命令模式与函数对象十分类似,但在C++主流框架中,函数对象(function object)应用的更为广泛。 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从

    2024年02月06日
    浏览(41)
  • 《golang设计模式》第三部分·行为型模式-02-命令模式(Command)

    命令模式(Command)将类的业务行为以对象的方式封装,以便实现行为的参数化、撤销或重做等需求。 非命令模式的困惑: 类的行为在运行时是以实例方法的形式调用的,当方法执行完毕并返回后,方法栈将会消除;方法的运行状态(主要指局部变量)保存在栈帧中,它会随

    2024年02月07日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包