【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,再用构造方法指定要控制的设备即可。

你可能感兴趣的:(#,设计模式,命令模式,设计模式,java,开发语言)