【Java开发】设计模式 15:命令模式

1 命令模式介绍

命令模式是一种行为设计模式,它允许你将操作封装在对象中,从而使你可以将其参数化并将其它对象中的操作排入队列、记录日志、进行撤销等操作。

在命令模式中,所有需要执行的操作都被包装在一个命令类中,接收者和调用者之间不存在直接引用。通过将一个或多个命令交给调用者执行,减少了对象之间的直接耦合,增强了整个系统的可扩展性。

📌 场景

命令模式的应用场景包括但不限于:撤销和重做操作、队列请求、日志记录、事务处理等。

📌 优点

  1. 解耦合:命令模式可以将命令与其接受者(执行者)解耦合,从而使命令发送者(调用者)和接受者(执行者)之间的耦合度降低,可以独立修改和扩展它们。
  2. 可扩展性:命令模式可以方便地添加新的命令或修改现有的命令,从而实现系统的扩展和灵活性。
  3. 记录日志:命令模式可以方便地记录日志,可以记录所有执行过的命令,以便以后进行跟踪和调试。

📌 缺点

  1. 命令类可能会增多:因为每个具体命令都需要一个具体的命令类来实现,所以如果命令过多,则会增加系统的复杂度。
  2. 可能造成系统性能瓶颈:如果系统中存在大量的命令对象,执行这些命令可能会对系统的性能造成影响。
  3. 执行花费时间:由于命令是通过一个个对象来完成的,因此,在执行命令时可能需要执行大量的对象,这可能会带来一定的时间开销。

2 命令模式实现

以手机控制电视机开启为例:

现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。

📌 1.定义命令接收者

/**
 * 命令接收者
 */
public interface Receiver {
    /**
     * 开启
     */
    void open();
}

📌 2.定义电视机

/**
 * 电视机
 */
public class Television implements Receiver{
    @Override
    public void open() {
        System.out.println("电视机已开启");    
    }
}

📌 3.定义命令

/**
 * 命令
 */
public abstract class Command {
    /**
     * 命令接收者
     */
    private final Receiver receiver;

    /**
     * 绑定命令与命令接收者
     * @param receiver 命令接收者
     */
    public Command(Receiver receiver) {
        this.receiver = receiver;
    }

    /**
     * 执行命令
     */
    public void execute() {
        // 开启
        this.receiver.open();
    }
}

📌 4.定义开启命令

/**
 * 开启命令
 */
public class OpenCommand extends Command {
    /**
     * 开启电视机
     * @param television 电视机
     */
    public OpenCommand(Television television) {
        super(television);
    }
}

📌 5.定义控制器

/**
 * 控制器
 */
public class Controller {
    /**
     * 发出命令
     * @param command 命令
     */
    public static void call(Command command) {
        command.execute();
    }
}

📌 6.调用

public class Client {
    public static void main(String[] args) {
        // 定义电视机
        Television television = new Television();
        // 使用终端设备发送命令到控制器
        // 控制器发出开启命令到电视机
        // 电视机接收到开启命令后开始启动
        Controller.call(new OpenCommand(television));
    }
}

电视机已开启

这样就实现了通过命令开启电视机。如果需要添加其他命令,比如说关闭,只需要定义一个关闭命令继承 Command,再用构造方法指定要控制的设备即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值