zoukankan      html  css  js  c++  java
  • 命令模式

    手腕旧伤又疼了,想当键盘侠都难,最近都没有输入输出,颓废了


    1. 命令模式(Command Pattern)

    请求 封闭成对象,以便使用命令来参数化其它对象,或者将命令对象放入队列中进行排队对行为进行记录、撤销或重做、事务等处理。应用在请求行为和实现者需要解耦的场合,以便撤销等动作


    命令模式的组成:

    • Command:封装命令的对象
    • Receiver:命令真正的执行者
    • Invoker:通过它来调用命令
    • Client:可以设置命令与命令的接收者




    2. 流程

    实现一个基于命令模式的开关灯功能


    2.1 Receiver(灯 Light)

    public class Light {
    
        public void on() {
            System.out.println("Light is on");
        }
    
        public void off() {
            System.out.println("Light is off");
        }
    }
    


    2.2 Command 命令

    // 命令接口
    public interface Command {
        void execute();
    }
    

    // 命令接口
    public class LightOnCommand implements Command {
        Light light;
    
        public LightOnCommand(Light light) {
            this.light = light;
        }
    
        @Override
        public void execute() {
            light.on();
        }
    }
    

    // 命令接口
    public class LightOffCommand implements Command {
        Light light;
    
        public LightOffCommand(Light light) {
            this.light = light;
        }
    
        @Override
        public void execute() {
            light.off();
        }
    }
    


    2.3 Invoker

    public class Invoker {
        private List<Command> commands = new LinkedList<>();
    
        public void receiveCommand(Command command) {
            commands.add(command);
        }
    
        public void executeCommand() {
            for (Command temp : commands) {
                temp.execute();
            }
            // 这里可以记录命令的执行顺序
            commands.clear();
        }
    }
    


    2.4 Client

    public class Client {
        public static void main(String[] args) {
            Light light = new Light();
            LightOnCommand lightOnCommand = new LightOnCommand(light);
            LightOffCommand lightOffCommand = new LightOffCommand(light);
            Invoker invoker = new Invoker();
            invoker.receiveCommand(lightOnCommand);
            invoker.receiveCommand(lightOffCommand);
            invoker.executeCommand();
        }
    }
    

  • 相关阅读:
    Backtracking_37. 解数独
    Backtracking_131. 分割回文串
    DFS_90. 子集 II
    DFS_78. 子集
    DFS_216. 组合总和 III
    非对称加密和ssh免密登陆验证、邮件发送接收、网站CA证书验证
    hibernate一对多哪一方放弃权利?
    关于java转json的一些细节问题
    一个web程序中访问频率较高的url为什么要加时间戳?(特别是异步加载)
    阿里电面经验
  • 原文地址:https://www.cnblogs.com/Howlet/p/15264784.html
Copyright © 2011-2022 走看看