20-命令模式

 


20-命令模式

1.命令模式

  1. 命令模式服务端。
// 事件对象,不同的事件对象对应不同的命令。
public class Event {

    public static final Event GOT_DIAMOND = new Event();
    public static final Event GOT_START = new Event();
}
// 请求,请求中包含事件对象。
public class Request {

    private Event event;

    public Event getEvent() {
        return event;
    }
}

public interface Command {

    void execute();
}
// 获取钻石
public class GotDiamondCommand implements Command {

    // 一个命令主要包含两部分:具体和命令和执行命令需要的数据。
    // 执行命令需要的数据。
    private final String data;
    public GotDiamondCommand(String data) {
        this.data = data;
    }

    @Override
    public void execute() {
        System.out.println("GotDiamondCommand execute." + this.data);
    }
}
public class GotStartCommand implements Command {

    private final String data;
    public GotStartCommand(String data) {
        this.data = data;
    }

    @Override
    public void execute() {
        System.out.println("GotStartCommand execute." + this.data);
    }
}
  1. 命令模式客户端。
public class GameApplication {

    private static final int MAX_HANDLER_REQ_COUNT_LOOP = 100;
    private Queue<Command> queue = new LinkedList<>();

    public void mainLoop() {
        while (true) {
            List<Request> requests = new ArrayList<>();
            Command command = null;

            // 省略从epoll或select中获取请求并封装为Request的过程。
            for (Request request : requests) {
                Event event = request.getEvent();
                if (event.equals(Event.GOT_DIAMOND)) {
                    // 将命令封装为对象,将命令的发送和执行解耦。
                    command = new GotDiamondCommand("Got Diamond Command.");
                } else if (event.equals(Event.GOT_START)) {
                    command = new GotStartCommand("Got Start Command.");
                }
                queue.add(command);
            }

            int handlerCount = 0;
            while (handlerCount < MAX_HANDLER_REQ_COUNT_LOOP) {
                if (queue.isEmpty()) {
                    Command c = queue.poll();
                    c.execute();
                    handlerCount++;
                }
            }
        }
    }
}

2.命令模式总结

  1. <<设计模式:可复用面向对象软件的基础>>中命令模式的定义:命令模式将请求(也称为命令)封装为对象,这样,请求就可以作为参数来传递,并且能够支持请求的排队执行、记录日志、撤销等功能。

  2. 命令模式理解难度大,使用频率低,只有在特定场合使用;命令模式通过将命令封装为对象,解耦命令的发送和执行,进而方便对命令进行执行复杂的操作,如异步、延迟、排队执行命令、撤销重做命令、存储命令、记录命令的执行日志。

  3. 命令模式和策略模式的区别。命令模式和策略模式的代码实现比较相近,但是应用场景是不同的。在策略模式中,不同的策略具有相同的目的、不同的实现,互相之间可以替换;而在命令模式中,不同的命令具有不同的目的,对应不同的处理逻辑,并且相互之间不可替换。

posted @   行稳致远方  阅读(15)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示