• 设计模式之命令模式(行为型)


    1、命令模式定义

    命令模式(Command),将一个请求封装为一个对象,请求以命令的形式包裹在对象中,传递给调用对象,调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。

    • 命令模式本质是对命令进行封装,将发出命令的责任和执行命令的责任分开
    • 每个命令都是一个操作,一方发出请求要执行操作,另一方接收请求并执行操作
    • 命令模式使请求本身成为一个对象,这个对象可以和其他对象一样被存储和作为参数传递

    2、命令模式结构

    在这里插入图片描述

    Command:声明执行命令的接口

    /**
     * 执行命令
     */
    public interface Command {
    
        /**
         * 执行命令
         */
        void execute();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ConcreteCommand:具体的命令,调用接收者执行对应的操作

    import lombok.Data;
    
    import java.util.List;
    
    /**
     * 将一个接收者绑定于一个动作,调用接收者执行相应的操作
     */
    @Data
    public class ConcreteCommand implements Command {
    
        /**
         * 命令接收对象
         */
        protected List<Receiver> receiverList;
    
        @Override
        public void execute() {
            receiverList.forEach(Receiver::action);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Invoker:要求该命令执行这个请求

    import lombok.Data;
    
    /**
     * 要求该命令执行这个请求
     */
    @Data
    public class Invoker {
    
        /**
         * 要执行的命令
         */
        private Command command;
    
        /**
         * 执行当前命令
         */
        public void executeCommand() {
            command.execute();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Receiver:命令接收者,知道如何实施与执行一个与请求相关的操作

    import lombok.Data;
    
    /**
     * 接收者,执行一个与请求相关的操作,任何类都可以作为一个接收者
     */
    @Data
    public class Receiver {
    
        private String name;
    
        public void action() {
            System.out.println(name + " 执行了请求~");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    调用方代码

    import java.util.ArrayList;
    import java.util.List;
    
    public class CommandClient {
    
        public static void main(String[] args) {
            // 命令的接收者
            List<Receiver> receiverList = new ArrayList<>();
            Receiver receiver = new Receiver();
            receiver.setName("张三");
            Receiver receiver2 = new Receiver();
            receiver2.setName("李四");
            receiverList.add(receiver);
            receiverList.add(receiver2);
            // 具体命令
            ConcreteCommand concreteCommand = new ConcreteCommand();
            concreteCommand.setReceiverList(receiverList);
            // 要执行的命令
            Invoker invoker = new Invoker();
            invoker.setCommand(concreteCommand);
            //执行具体命令
            invoker.executeCommand();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3、命令模式优点

    • 命令模式可以较容易的设计一个命令队列,在需要的情况下,可以较为容易的将命令记入日志
    • 允许接收请求的一方决定是否要否决请求,可以容易的实现对请求的撤销和重做,调用统一方法可以实现不同的功能
    • 由于新加入的具体命令类不影响其它的类,所以增加新的具体命令较为容易
    • 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开,降低对象之间的耦合度

    4、命令模式缺点

    命令模式针对每一个模式都要设计一个具体的命令类,某些系统可能需要大量的具体命令类,这将会影响命令模式的使用

  • 相关阅读:
    Maven的profiles多环境配置
    web3j solidity 转java
    在Linux命令行中查找空目录
    完美修复google翻译失效的问题
    W5500-EVB-PICO进行MQTT连接订阅发布教程(十二)
    5G时代全面到来,浅谈移动通信的前世今生
    01标定相关理论
    Go语学习笔记 - gorm使用 - 表增删改查 Web框架Gin(八)
    Citespace、vosviewer、R语言的文献计量学 、SCI
    C++基础——类与对象
  • 原文地址:https://blog.csdn.net/qq_53316135/article/details/127505199