Loading...

Java设计模式(13)命令模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(12)责任链模式》文章中,我们介绍了责任链模式。本文是这个系列的第十三篇章,我们将讲解一下命令模式的实现方式、应用场景以及它的用途。

命令模式

命令模式是一种行为设计模式,它将请求封装为一个对象,从而使您可以用不同的请求参数化客户端、对请求排队或记录日志,以及支持可撤销的操作。通过将动作请求(命令)封装成对象,命令模式允许请求的调用者和接收者完全解耦,使得命令可以存储、传递或延迟执行。

使用场景

1. 事务脚本:在执行某项任务时需要执行一系列操作,并且可能需要撤销。

2. 日志和回滚:在系统中记录执行的命令,以便在出现问题时能够回滚。

3. 队列请求:可以将命令放入队列中,进行异步执行。

4. 宏命令:一次执行一组命令的场景(如批量处理操作)。

5. 实现 Undo/Redo:用户界面中,用户的操作可以被撤销和重做。

代码实现

这里模拟一个遥控器来简单实现一下这个命令模式,通过遥控器发送命令去控制TV,首先得有一个TV

/**
 * 电视(接收者)
 * @author Jensen
 * @date 2024-04-18
 * */
public class Tv {
    public void turnOn(){
        System.out.println("电视打开了");
    }
    public void turnOff(){
        System.out.println("电视关闭了");
    }
}

然后再有一个command接口,并创建“TurnOnTvCommand”,“TurnOffTvCommand”类,里面是具体的实现

Command

/**
 * 命令接口
 * @author Jensen
 * @date 2024-04-18
 * */
public interface Command {
    void execute();
}

TurnOnTvCommand

/**
 * 打开电视命令
 * @author Jensen
 * @date 2024-04-18
 * */
public class TurnOnTvCommand implements Command {
    private final Tv tv;

    public TurnOnTvCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOn();
    }
}

TurnOffTvCommand

/**
 * 关闭电视命令
 * @author Jensen
 * @date 2024-04-18
 * */
public class TurnOffTvCommand implements Command {
    private final Tv tv;

    public TurnOffTvCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOff();
    }
}

最后创建一个遥控器类:RemoteControl,此类供客户端使用

/**
 * 遥控器
 * @author Jensen
 * @date 2024-04-18
 * */
public class RemoteControl {
    private Command command;
    public void setCommand(Command command){
        this.command = command;
    }
    public void pressButton(){
        command.execute();
    }
}

测试使用

        System.out.println("------------------------------命令模式-----------------------------");
        Tv tv = new Tv();
        TurnOnTvCommand turnOnTvCommand = new TurnOnTvCommand(tv);
        TurnOffTvCommand turnOffTvCommand = new TurnOffTvCommand(tv);
        com.nn.command.RemoteControl remoteControl = new com.nn.command.RemoteControl();
        //打开电视操作
        remoteControl.setCommand(turnOnTvCommand);
        remoteControl.pressButton();
        
        //关闭电视操作
        remoteControl.setCommand(turnOffTvCommand);
        remoteControl.pressButton();

输出:

image.png

结语

使用命令模式的优点

解耦:将请求的发出者和执行者解耦,便于扩展和维护。

扩展性:可以方便地添加新的命令和撤销功能,而不影响其他代码。

支持日志和事务:可以记录命令,便于实现撤销、重做操作。

实际应用中的命令模式

事务管理:如数据库操作或文件操作中,可以使用命令模式来封装操作请求,以实现事务管理和日志记录。

任务调度系统:在任务调度系统中,每个任务可以看作一个命令对象,通过调度器进行异步处理。

总之,命令模式通过将请求封装为对象,使得系统可以更灵活地管理命令的执行和撤销,适合于任务操作和事务管理等场景。

0

回到顶部