命令模式

命令模式:命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同的对象依赖注入到其他对象),并且能够支持请求(命令)的队列,记录日志。撤销等(附加控制)功能

public interface Command {
  void execute();
}
<p>public class GotDiamondCommand implements Command {
// 省略成员变量</p>
<p>public GotDiamondCommand(/<em>数据</em>/) {
//...
}</p>
<p>@Override
public void execute() {
// 执行相应的逻辑
}
}
//GotStartCommand/HitObstacleCommand/ArchiveCommand类省略</p>
<p>public class GameApplication {
private static final int MAX_HANDLED_REQ_COUNT_PER_LOOP = 100;
private Queue<Command> queue = new LinkedList<>();</p>
<p>public void mainloop() {
while (true) {
List<Request> requests = new ArrayList<>();</p>
<pre><code>  //省略从epoll或者select中获取数据,并封装成Request的逻辑,
  //注意设置超时时间,如果很长时间没有接收到请求,就继续下面的逻辑处理。
  
  for (Request request : requests) {
    Event event = request.getEvent();
    Command command = null;
    if (event.equals(Event.GOT_DIAMOND)) {
      command = new GotDiamondCommand(/*数据*/);
    } else if (event.equals(Event.GOT_STAR)) {
      command = new GotStartCommand(/*数据*/);
    } else if (event.equals(Event.HIT_OBSTACLE)) {
      command = new HitObstacleCommand(/*数据*/);
    } else if (event.equals(Event.ARCHIVE)) {
      command = new ArchiveCommand(/*数据*/);
    } // ...一堆else if...

    queue.add(command);
  }

  int handledCount = 0;
  while (handledCount &lt; MAX_HANDLED_REQ_COUNT_PER_LOOP) {
    if (queue.isEmpty()) {
      break;
    }
    Command command = queue.poll();
    command.execute();
  }
}

} }

命令模式与策略模式,工厂模式长的非常像,工厂侧重类的创建,策略侧重目的一致性,不同的命令可能有不同的目的,不同应对逻辑

主要场景:多线程,蓝牙