zoukankan      html  css  js  c++  java
  • 设计模式之美学习-行为型-命令模式(三十四)

    什么是命令模式

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

    与策略模式很像,我们不能用编码来区分模式,而是应用场景

    代码实现

    /**
     * 抽象的命令
     */
    public interface Command {
        void execute();
    }
    
    /**
     *具体的命令处理
     */
    public class GotDiamondCommand implements Command {
        // 省略成员变量
    
        public GotDiamondCommand(/*数据*/) {
            //...
        }
    
        @Override
        public void execute() {
            // 执行相应的逻辑
        }
    }
    //GotStartCommand/HitObstacleCommand/ArchiveCommand类省略
    
    public class GameApplication {
        private static final int MAX_HANDLED_REQ_COUNT_PER_LOOP = 100;
        //将命令存放到队列
        private Queue<Command> queue = new LinkedList<>();
    
        public void mainloop() {
            while (true) {
                List<Request> requests = new ArrayList<>();
                //省略从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 < MAX_HANDLED_REQ_COUNT_PER_LOOP) {
                    if (queue.isEmpty()) {
                        break;
                    }
                    Command command = queue.poll();
                    command.execute();
                }
            }
        }
    }
  • 相关阅读:
    UVA11367 Full Tank?
    不均衡样本集问题
    NLP interview
    Linux 指令
    Python 趣题
    Grid Illumination
    动态规划-Minimum Cost to Merge Stones
    Contest 141
    Python join()方法
    Single Number
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12742528.html
Copyright © 2011-2022 走看看