小谈设计模式(24)—命令模式

简介: 小谈设计模式(24)—命令模式

专栏介绍

专栏地址

http://t.csdnimg.cn/VpriY

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

命令模式

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

角色分析

命令(Command)

定义了执行操作的接口,通常包含一个execute()方法,用于执行相关操作。

具体命令(ConcreteCommand)

实现了命令接口,具体定义了执行操作的具体逻辑。

接收者(Receiver)

执行命令所要求的操作,是具体命令对象的业务处理对象。

调用者(Invoker)

负责调用命令对象执行请求,通常会持有命令对象的引用。

客户端(Client)

创建具体命令对象,并设置命令对象的接收者。

工作流程

1

客户端创建具体命令对象,并设置命令对象的接收者。

2

调用者持有具体命令对象的引用,并调用命令对象的execute()方法。

3

具体命令对象执行相关操作,并将请求传递给接收者进行处理。

Java程序实现

// 定义命令接口
public interface Command {
    void execute();
}

// 定义具体命令类
public class ConcreteCommand implements Command {
    private Receiver receiver;

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

    public void execute() {
        receiver.action();
    }
}

// 定义接收者类
public class Receiver {
    public void action() {
        System.out.println("接收者执行操作");
    }
}

// 定义调用者类
public class Invoker {
    private Command command;

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

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

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Receiver receiver = new Receiver();
        
        // 创建具体命令对象,并传入接收者对象
        Command command = new ConcreteCommand(receiver);
        
        // 创建调用者对象,并设置具体命令对象
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        
        // 调用者执行命令
        invoker.executeCommand();
    }
}

分析

在上面的示例中,定义了一个命令接口 Command,具体命令类 ConcreteCommand 实现了该接口,并在 execute() 方法中调用接收者对象的操作方法。


接收者类 Receiver 定义了具体的操作方法 action()。


调用者类 Invoker 持有一个命令对象,并提供了 setCommand() 方法来设置具体的命令对象,以及 executeCommand() 方法来执行命令。


在客户端代码中,创建了接收者对象、具体命令对象和调用者对象,并设置具体命令对象到调用者对象中,最后调用调用者对象的 executeCommand() 方法来执行命令。

输出结果

···

接收者执行操作

···

优缺点分析

优点

解耦调用者和接收者

命令模式将请求封装成一个对象,使得调用者不需要知道接收者的具体实现,只需要通过命令对象来执行请求。这样可以降低调用者和接收者之间的耦合度,提高系统的灵活性和可维护性。

支持请求的排队和记录

命令模式可以将多个命令对象放入队列中,按照一定的顺序执行。这样可以实现请求的排队和调度,也可以记录请求日志,方便后续操作和追踪。

支持撤销操作

命令模式可以保存命令对象的状态,从而支持撤销操作。通过保存命令对象的历史状态,可以实现撤销和恢复操作,提供更好的用户体验。

可扩展性强

命令模式可以通过新增具体命令类来扩展系统的功能,而不需要修改现有的代码。这样可以保持系统的稳定性,同时也方便了系统的维护和升级。

缺点

类的数量增加

引入命令模式会增加系统中的类的数量,每个具体命令类都需要实现命令接口。这样可能会增加系统的复杂性,降低代码的可读性。

命令的执行效率

由于命令模式需要将请求封装成对象,并通过调用者来执行,因此相比直接调用接收者的方法,命令模式的执行效率可能会稍低。

可能引入额外的复杂性

命令模式需要设计和管理命令对象、调用者、接收者等多个角色,可能会引入额外的复杂性。尤其是在处理多个命令对象之间的协作和交互时,需要仔细设计和管理。

总结

命令模式在需要将请求封装成对象、支持请求的排队、记录请求日志、撤销操作等场景下非常有用。但在一些简单的场景下,引入命令模式可能会增加系统的复杂性,需要权衡使用。



相关文章
|
7月前
|
设计模式 UED
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
182 0
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
4月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
5月前
|
设计模式 JavaScript API
js设计模式【详解】—— 命令模式
js设计模式【详解】—— 命令模式
48 6
|
6月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
6月前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
33 0
|
6月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
6月前
|
设计模式
设计模式之命令模式
设计模式之命令模式
|
7月前
|
设计模式 Java 调度
【设计模式系列笔记】命令模式
命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志请求参数化客户端对象,同时支持撤销操作。
74 1
|
7月前
|
设计模式 存储 Java
【搞懂设计模式】命令模式:从遥控器到编程的妙用!
【搞懂设计模式】命令模式:从遥控器到编程的妙用!
80 0