设计模式 16 命令模式

命令模式(Command Pattern)属于行为型模式

概述

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

命令模式将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

代码实现

这里以手机控制电视机开启为例介绍命令模式:

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、调用

// 定义电视机
Television television = new Television();
// 使用终端设备发送命令到控制器
// 控制器发出开启命令到电视机
// 电视机接收到开启命令后开始启动
Controller.call(new OpenCommand(television));

输出结果为:

电视机已开启

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

优缺点

优点

1、降低了系统耦合度。

2、新的命令可以很容易添加到系统中去。

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景

需要用命令的地方都可以使用命令模式,比如:

1、GUI 中每一个按钮都是一条命令。

2、模拟 CMD。

注意事项

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。

命令模式结构示意图:

img


参考

https://www.bilibili.com/video/BV1u3411P7Na?p=24&vd_source=299f4bc123b19e7d6f66fefd8f124a03

posted @ 2022-08-14 17:30  天航星  阅读(32)  评论(0编辑  收藏  举报