Java设计模式之命令模式详细解析

 更新时间:2024年01月24日 10:37:21   作者:爱上口袋的天空  
这篇文章主要介绍了Java设计模式之命令模式详细解析,命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时也支持可撤销的操作,需要的朋友可以参考下

1、简介

1.1、定义

命令模式:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。(同时也支持可撤销的操作)

1.2、解决的问题

通常在系统设计中,行为请求者和行为实现者是紧耦合的关系。

而在一些特定的场景下,比如:需要对行为进行记录、撤销或重做、事务等处理时,需要将行为请求者和行为实现者分离开来,这时就可以用到命令模式。

1.3、模式结构

  • Command:定义命令的接口,声明执行的方法
  • ConcreteCommand:命令接口实现对象,是“命令接口”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作
  • Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能
  • Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口
  • Client:创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行

1.4、结构类图

在这里插入图片描述

1.5、运作流程

  1. Client创建一个ConcreteCommand对象并指定他的Receiver对象
  2. 某个Invoker对象存储该ConcreteCommand对象
  3. 该Invoker通过调用Command对象的Execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令
  4. ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求

2、示例Demo

2.1、Command

package com.jbp.designpattern.command;
/**
 * @ClassName: Order
 * @description: 命令接口 --- Command
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:15
 * @Version: 1.0
 **/
public interface Order {
    void execute();
}
 

2.2、ConcreteCommand

package com.jbp.designpattern.command;
/**
 * @ClassName: BuyStock
 * @description: 加库存 --- ConcreteCommmand
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:39
 * @Version: 1.0
 **/
public class BuyStock implements Order{
    private Stock stock;
    public BuyStock(Stock stock) {
        this.stock = stock;
    }
    @Override
    public void execute() {
        stock.buy();
    }
}
 
package com.jbp.designpattern.command;
/**
 * @ClassName: SellStock
 * @description: 清库存 --- ConcreteCommmand
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:41
 * @Version: 1.0
 **/
public class SellStock implements Order{
    private Stock stock;
    public SellStock(Stock stock) {
        this.stock = stock;
    }
    @Override
    public void execute() {
        stock.sell();
    }
}
 

2.3、Receiver

package com.jbp.designpattern.command;
/**
 * @ClassName: Stock
 * @description: 请求类  --- Receiver
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:16
 * @Version: 1.0
 **/
public class Stock {
    private String name = "库存一号";
    // 数量
    private int quantity = 10;
    public void buy(){
        System.out.println("名字:" + name + ",数量:" + quantity);
    }
    public void sell(){
        System.out.println("名字:" + name + ",数量:" + quantity);
    }
}
 

2.4、Invoker

package com.jbp.designpattern.command;
import java.util.ArrayList;
import java.util.List;
/**
 * @ClassName: Broker
 * @description: 命令调用类  --- invoker
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:43
 * @Version: 1.0
 **/
public class Broker {
    private List<Order> orderList = new ArrayList<>();
    // 加库存
    public void takeOrder(Order order){
        orderList.add(order);
    }
    // 清库存
    public void placeOrders(){
        for (Order order : orderList) {
            order.execute();
        }
        orderList.clear();
    }
}
 

2.5、Client

package com.jbp.designpattern.command;
/**
 * @ClassName: test
 * @description: 测试 --- Client
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:50
 * @Version: 1.0
 **/
public class test {
    public static void main(String[] args) {
        Stock stock = new Stock();
        BuyStock buyStock = new BuyStock(stock);
        SellStock sellStock = new SellStock(stock);
        Broker broker = new Broker();
        broker.takeOrder(buyStock);
        broker.takeOrder(sellStock);
        broker.placeOrders();
    }
}
 

3、优缺点

优点

类间解耦:调用者角色与接收者角色之间没有任何依赖关系可扩展性:Command的子类具备高扩展性可以比较容易地设计一个组合命令

缺点

Command的子类过多(如果有过多的命令,就会有过多的Command子类)

使用场景

队列请求日志请求系统需要将一组操作组合在一起,即支持宏命令

到此这篇关于Java设计模式之命令模式详细解析的文章就介绍到这了,更多相关Java命令模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot基础学习之Mybatis操作中使用Redis做缓存详解

    Spring Boot基础学习之Mybatis操作中使用Redis做缓存详解

    这篇文章主要给大家介绍了关于Spring Boot基础学习之Mybatis操作中使用Redis做缓存的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-11-11
  • Java8 Collectors.toMap的坑

    Java8 Collectors.toMap的坑

    这篇文章主要介绍了Java8 Collectors.toMap的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询

    MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询

    本文主要介绍了MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • SpringBoot如何读取resources目录下的文件

    SpringBoot如何读取resources目录下的文件

    这篇文章主要介绍了SpringBoot如何读取resources目录下的文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写,权限修饰符用于控制被修饰变量、方法、类的可见范围,说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高
    2021-10-10
  • SpringBoot同一接口多个实现类配置的实例详解

    SpringBoot同一接口多个实现类配置的实例详解

    这篇文章主要介绍了SpringBoot同一接口多个实现类配置的实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • eclipse中没有SERVER的解决办法(超详细)

    eclipse中没有SERVER的解决办法(超详细)

    使用eclipse进行tomcat配置时,经常会发现一个重要的问题就是打开eclipse之后没有了server选项,所以本给大家详细介绍了eclipse中没有SERVER的解决办法,文中有详细的图文讲解,需要的朋友可以参考下
    2023-12-12
  • java final 和instanceof 关键字的区别

    java final 和instanceof 关键字的区别

    这篇文章介绍了java final 和instanceof 关键字的区别,有需要的朋友可以参考一下
    2013-09-09
  • java高级应用:线程池的全面讲解(干货)

    java高级应用:线程池的全面讲解(干货)

    这篇文章主要介绍了java高级应用:线程池的全面讲解(干货),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • JHipster如何修改JDL中的entity

    JHipster如何修改JDL中的entity

    这篇文章主要介绍了JHipster如何修改JDL中的entity问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论