软件设计 命令模式 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。

 
posted @ 2023-02-11 14:59  kuaiquxie  阅读(34)  评论(0编辑  收藏  举报