设计模式之命令模式

前言

命令模式(Command Pattern)是 23种设计模式之一,属于行为型设计模式。

命令模式把一个请求或者操作封装到一个对象中。
命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

正文

一、命令模式的设计概念

命令模式包含有5个角色。如下图:
在这里插入图片描述

  • 抽象命令角色(Command):声明执行操作的接口。

  • 具体命令角色(ConcreteCommand):将一个接收者对象绑定于一个动作,调用接收者相应的操作以实现Execute。

  • 请求者角色(Invoker):负责调用相关的命令体执行请求。

  • 接收者角色(Receiver):负责具体实施和执行某一个请求。

二、Java代码示例

依据第一节的类图,进行代码实现。有部分变更调整。
代码结构如下:
在这里插入图片描述

2.1 Command

package org.feng;

/**
 * 命令接口
 *
 * @author feng
 */
public interface Command {
   

    /**
     * 执行命令
     */
    void execute();
}

2.2 LsCommand

package org.feng;

/**
 * ls命令
 *
 * @author feng
 */
public class LsCommand implements Command {
   

    private final Receiver receiver;

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

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

2.3 MkdirCommand

package org.feng;

/**
 * mkdir命令
 *
 * @author feng
 */
public class MkdirCommand implements Command {
   

    private final Receiver receiver;

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

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

2.4 Receiver

package org.feng;

/**
 * 命令接收者
 *
 * @author feng
 */
public interface Receiver {
   

    default void ls() {
   
        System.out.println("执行【ls】命令");
    }

    default void mkdir() {
   
        System.out.println("执行【mkdir】命令");
    }
}

2.5 DefaultReceiver

package org.feng;

/**
 * 默认的命令接收者
 *
 * @author feng
 */
public class DefaultReceiver implements Receiver {
   
}

2.6 Invoker

package org.feng;

/**
 * 请求者
 *
 * @author feng
 */
public class Invoker {
   

    private Command command;

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

    public void executeCommand() {
   
        this.command.execute();
    }

    public void setCommandAndExecute(Command command) {
   
        setCommand(command);
        executeCommand();
    }
}

三、测试

3.1 Client

package org.feng;

/**
 * 测试-客户端
 *
 * @author feng
 */
public class Client {
   

    public static void main(String[] args) {
   
        Receiver receiver = new DefaultReceiver();
        Command ls = new LsCommand(receiver);
        Command mkdir = new MkdirCommand(receiver);

        Invoker request = new Invoker();
        request.setCommandAndExecute(ls);
        request.setCommandAndExecute(mkdir);
    }
}

3.2 测试结果

执行【ls】命令
执行【mkdir】命令

四、命令模式的小结

4.1 适用性

  • 命令模式适用于操作请求能够被当作是命令的情况

  • 命令模式适用于系统需要支持回退或者撤销某操作的情况

4.2 总结

命令模式将命令的请求者和命令的处理者分开来,命令的请求者也不清楚请求的命令由哪个对象来执行,也不知道具体实现的操作是怎么样的。

命令模式可以将命令组合起来形成一个复杂的宏命令,这样可以通过一个命令来实现一系列化的操作。

由于命令的发起者和命令的处理者完全解耦,所以命令模式有很好的扩展性,要扩展新的命令只需要添加新的命令类然后再客户端调用的时候动态的将其装载进去就可以了。

由于命令模式针对每一个命令都会新建一个类去包装形成一个对象,这样在系统的逐步扩大的过程中会形成许多的命令类使得系统更加复杂并且增加内存的消耗。

相关推荐

  1. 设计模式命令模式

    2024-02-20 06:42:05       9 阅读
  2. 【前端设计模式命令模式

    2024-02-20 06:42:05       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 06:42:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 06:42:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 06:42:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 06:42:05       20 阅读

热门阅读

  1. 详细介绍设计模式七大原则

    2024-02-20 06:42:05       24 阅读
  2. 【linux命令】-scp远程拷贝文件的命令scp使用

    2024-02-20 06:42:05       28 阅读
  3. 米贸搜|Facebook 老是封主页,怎么回事?

    2024-02-20 06:42:05       35 阅读
  4. [SSD 测试 1.3] 硬件测试之主控测试用例

    2024-02-20 06:42:05       32 阅读
  5. 【计算机程序装入和链接】

    2024-02-20 06:42:05       27 阅读
  6. unity中实现3D物体在UI前方

    2024-02-20 06:42:05       33 阅读
  7. ssh 免密登录

    2024-02-20 06:42:05       29 阅读
  8. Pytorch-Adam算法解析

    2024-02-20 06:42:05       31 阅读