设计模式行为模式-命令模式

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

前言

定义

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

结构

命令模式由以下几个核心组件组成:

  • 命令(Command): 定义了执行操作的接口。通常包含一个 execute() 方法,该方法在调用时会触发接收者执行相关操作。
  • 具体命令(Concrete Command):实现命令接口,并将真正的操作委托给接收者。
  • 接收者(Receiver):负责执行实际的操作。具体命令将请求委托给接收者完成具体的业务逻辑。
  • 调用者(Invoker):负责调用命令并触发执行操作的方法。
  • 客户端(Client):创建具体命令,并将其与接收者进行绑定。
    设计模式行为模式-命令模式,设计模式学习,设计模式,java

工作原理

  1. 客户端创建一个具体命令,并将其与接收者(执行操作的对象)进行绑定。
  2. 调用者接收到命令后,将其存储起来,可以将命令存储在队列中,以支持撤销和重做操作。
  3. 调用者根据需要调用命令的 execute() 方法。该方法会将请求传递给接收者,由接收者执行实际的操作。
  4. 接收者执行命令所指定的操作,并完成相应的业务逻辑。

优点

  • 解耦调用者和接收者:调用者无需了解命令的具体实现,只需调用命令对象的方法来触发执行。
  • 支持撤销和重做:通过存储命令的历史记录,可以方便地进行撤销和重做操作。
  • 支持事务:可以通过一系列的命令组合形成事务,保证一组操作的原子性。

适用场景

  • 需要将请求和执行操作解耦的情况。
  • 需要支持撤销、重做、事务等操作的场景。
  • 需要将一组操作组织成具体的命令队列或日志操作。

消息队列模式Demo实现

好的,下面是一个简单的使用 Java 实现的消息队列框架示例:

import java.util.LinkedList;
import java.util.Queue;

// 消息接口
interface IMessage {
    void execute();
}

// 具体消息类
class ConcreteMessage implements IMessage {
    private String content;

    public ConcreteMessage(String content) {
        this.content = content;
    }

    public void execute() {
        System.out.println("处理消息:" + content);
    }
}

// 消息队列类
class MessageQueue {
    private Queue<IMessage> queue;

    public MessageQueue() {
        queue = new LinkedList<>();
    }

    public void enqueue(IMessage message) {
        queue.offer(message);
    }

    public IMessage dequeue() {
        return queue.poll();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }
}

// 消费者类
class Consumer {
    private MessageQueue messageQueue;

    public Consumer(MessageQueue messageQueue) {
        this.messageQueue = messageQueue;
    }

    public void processMessages() {
        while (!messageQueue.isEmpty()) {
            IMessage message = messageQueue.dequeue();
            message.execute();
        }
    }
}

// 生产者类
class Producer {
    private MessageQueue messageQueue;

    public Producer(MessageQueue messageQueue) {
        this.messageQueue = messageQueue;
    }

    public void sendMessage(String content) {
        IMessage message = new ConcreteMessage(content);
        messageQueue.enqueue(message);
        System.out.println("发送消息:" + content);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建消息队列对象
        MessageQueue messageQueue = new MessageQueue();

        // 创建消费者对象并启动消费者线程
        Consumer consumer = new Consumer(messageQueue);
        Thread consumerThread = new Thread(consumer::processMessages);
        consumerThread.start();

        // 创建生产者对象并发送消息
        Producer producer = new Producer(messageQueue);
        producer.sendMessage("消息1");
        producer.sendMessage("消息2");
        producer.sendMessage("消息3");

        // 等待消费者线程处理完所有消息
        try {
            consumerThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们实现了一个简单的消息队列框架。IMessage 是消息接口,定义了 execute() 方法表示具体的消息处理逻辑。ConcreteMessage 是具体的消息类,实现了 IMessage 接口,并在 execute() 方法中执行具体的处理操作。

MessageQueue 是消息队列类,使用 Queue 数据结构来保存消息对象,并提供了入队、出队和判断队列是否为空的方法。

Consumer 是消费者类,通过循环从消息队列中取出消息,并调用消息对象的 execute() 方法进行处理。

Producer 是生产者类,负责向消息队列中发送消息。

在客户端代码的 main() 方法中,我们创建了一个消息队列对象,然后分别创建了消费者对象和生产者对象。生产者使用 sendMessage() 方法向消息队列发送消息,而消费者通过启动一个新线程来调用 processMessages() 方法处理消息。
设计模式行为模式-命令模式,设计模式学习,设计模式,java

分写业务

这个业务代码实现了一个简单的消息队列框架。下面对代码进行逐步解释:

  1. 首先,定义了一个消息接口 IMessage,其中包含了 execute() 方法用于执行具体的消息处理操作。

  2. 接着,实现了具体的消息类 ConcreteMessage,它实现了 IMessage 接口,并在 execute() 方法中执行具体的消息处理逻辑。在本例中,处理逻辑简单地打印出消息内容。

  3. 然后,定义了消息队列类 MessageQueue,使用 Queue 数据结构来保存消息对象。它提供了入队(enqueue())、出队(dequeue())和判断队列是否为空(isEmpty())的方法。

  4. 接下来,定义了消费者类 Consumer,它通过循环从消息队列中取出消息,并调用消息对象的 execute() 方法进行处理。

  5. 最后,定义了生产者类 Producer,它负责向消息队列中发送消息。通过调用 sendMessage() 方法,生产者创建一个具体的消息对象并将其加入到消息队列中,同时打印出发送的消息内容。

在客户端代码的 main() 方法中,完成以下步骤:

  1. 创建了一个消息队列对象 messageQueue

  2. 创建了消费者对象 consumer,并启动一个新线程来执行消费者的消息处理逻辑。

  3. 创建了生产者对象 producer,通过调用 sendMessage() 方法发送了三条消息。

  4. 最后,通过调用 join() 方法等待消费者线程处理完所有消息。

总结

这个示例展示了如何使用 Java 实现一个简单的消息队列框架。通过将消息封装为对象,我们可以方便地在生产者和消费者之间进行消息的传递和处理。使用消息队列框架可以实现解耦和异步处理的优势。生产者负责发送消息,消费者负责处理消息,它们通过共享的消息队列进行通信。通过多线程的方式,我们可以实现并发的消息处理,提高系统的吞吐量和响应性能。文章来源地址https://www.toymoban.com/news/detail-685188.html

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

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

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

相关文章

  • 行为型设计模式——命令模式

    日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命令模式包含以下主要角色: 抽象命令类(

    2024年01月17日
    浏览(44)
  • 设计模式之命令模式【行为型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年02月01日
    浏览(40)
  • 设计模式—行为型模式之命令模式

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

    2024年01月25日
    浏览(39)
  • 笨蛋学设计模式行为型模式-命令模式【19】

    8.6.1概念 ​ 命令模式允许将请求封装成一个对象(命令对象,包含执行操作所需地所有信息),并将命令对象按照一定的顺序存储在队列中,然后再逐一调用执行,这些命令可以支持反向操作,进行撤销和重做。这样发送者就只需要触发命令就可以完成操作,不需要知道接受者

    2024年01月23日
    浏览(38)
  • 设计模式(016)行为型之命令模式

            命令模式,它将请求封装成一个对象,从而允许客户端参数化操作队列、记录请求日志、支持撤销操作等。在命令模式中,有四个核心角色:命令接口(Command)、具体命令(ConcreteCommand)、调用者(Invoker)、接收者(Receiver)。 ① 命令接口(Command) :声明了执

    2024年04月11日
    浏览(37)
  • 【设计模式】第16节:行为型模式之“命令模式”

    命令模式:将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。 动作封装 解耦发送者跟接受者 可扩展性 简化和集中错误处理 支持撤

    2024年02月07日
    浏览(30)
  • 【设计模式|行为型】命令模式(Command Pattern)

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

    2024年02月15日
    浏览(35)
  • 掌握设计模式:深入了解命令模式的优雅调度与行为解耦

    命令模式是一种行为设计模式,其目的是将请求发送者和接收者解耦,从而允许发送者发送请求,而无需知道请求的具体处理方式。在命令模式中,请求被封装为一个对象,这个对象包含了执行请求所需的所有信息,包括调用方法、参数等。这样,请求的发送者只需知道如何

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

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

    2024年02月07日
    浏览(41)
  • 【十五】设计模式~~~行为型模式~~~状态模式(Java)

    【学习难度:★★★☆☆,使用频率:★★★☆☆】 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互

    2024年02月07日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包