23种设计模式——命令模式(Command Pattern)

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——命令模式(Command Pattern)
📚 ** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 核心概念

四. 代码示例

五. 使用场景

六. 总结


一. 背景

说到命令模式,可能很多人会想到Windows或者Mac的命令行。其实它们的关联并不大,因为命令行界面是一个​​人机交互系统。的工作原理更多是基于​​字符串解析 + 程序调用(如 shell 脚本、可执行程序)​​,而不是基于面向对象设计模式中的“命令对象封装”。​​也没有明确的 Command、Invoker、Receiver 对象模型。下面我将会像你介绍设计模式中的命令模式。


二. 介绍

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。


三. 核心概念

命令模式的核心思想是将"请求"封装成对象,将发出命令的责任和执行命令的责任分割开,委派给不同的对象。这种模式通过解耦发送者和接收者来实现更灵活的设计。
在命令模式中,通常包含以下角色:

  • 命令接口(Command):声明执行操作的接口
  • 具体命令(ConcreteCommand):实现命令接口,持有接收者对象的引用
  • 接收者(Receiver):执行具体业务逻辑的对象
  • 调用者(Invoker):负责调用命令对象执行请求
  • 客户端(Client):创建具体命令对象并设置其接收者

四. 代码示例

下面是一个开始和取消命令的实现。它和策略模式很像,但它最大的不同是,它将实际执行的代码都统一到了接收者 。

// 命令接口
public interface DownloadCommand {
    void execute();
    void undo();
}

// 具体命令 - 开始下载
public class StartDownloadCommand implements DownloadCommand {
    private DownloadReceiver receiver;
    private String fileUrl;
    
    public StartDownloadCommand(DownloadReceiver receiver, String fileUrl) {
        this.receiver = receiver;
        this.fileUrl = fileUrl;
    }
    
    @Override
    public void execute() {
        receiver.startDownload(fileUrl);
    }
    
    @Override
    public void undo() {
        receiver.cancelDownload(fileUrl);
    }
}

// 具体命令 - 暂停下载
public class PauseDownloadCommand implements DownloadCommand {
    private DownloadReceiver receiver;
    private String fileUrl;
    
    public PauseDownloadCommand(DownloadReceiver receiver, String fileUrl) {
        this.receiver = receiver;
        this.fileUrl = fileUrl;
    }
    
    @Override
    public void execute() {
        receiver.pauseDownload(fileUrl);
    }
    
    @Override
    public void undo() {
        receiver.resumeDownload(fileUrl);
    }
}

// 接收者 - 实际执行下载操作的对象
public class DownloadReceiver {
    public void startDownload(String fileUrl) {
        System.out.println("开始下载文件: " + fileUrl);
        // 实际的下载逻辑
    }
    
    public void cancelDownload(String fileUrl) {
        System.out.println("取消下载文件: " + fileUrl);
        // 实际的取消下载逻辑
    }
    
    public void pauseDownload(String fileUrl) {
        System.out.println("暂停下载文件: " + fileUrl);
        // 实际的暂停下载逻辑
    }
    
    public void resumeDownload(String fileUrl) {
        System.out.println("恢复下载文件: " + fileUrl);
        // 实际的恢复下载逻辑
    }
}

// 调用者 - 管理命令的执行
public class DownloadInvoker {
    private DownloadCommand command;
    private Stack<DownloadCommand> commandHistory = new Stack<>();
    
    public void setCommand(DownloadCommand command) {
        this.command = command;
    }
    
    public void executeCommand() {
        command.execute();
        commandHistory.push(command);
    }
    
    public void undoLastCommand() {
        if (!commandHistory.isEmpty()) {
            DownloadCommand lastCommand = commandHistory.pop();
            lastCommand.undo();
        }
    }
}

五. 使用场景

命令模式用于以下场景:

  • 需要将请求调用者和请求接收者解耦
  • 需要支持撤销操作
  • 需要支持队列操作
  • 需要记录操作日志
  • 需要支持事务操作

六. 总结

命令模式的主要优点是降低了系统组件之间的耦合度,使得系统更加灵活和易于维护。但同时也要注意,过多的命令类可能会增加系统的复杂性,因此在使用时需要权衡利弊。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值