• 6、命令模式


    命令模式定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。
    • 命令模式将发出请求的对象(RemoteControl遥控器类)和执行请求的对象(点灯类)解耦;
    • 在被解耦的对象之间通过Command对象进行沟通(例如LightCommand封装Light类的开灯与关灯命令);
    • 调用者通过调用命令execute()发出请求,execute()调用实际的执行者;
    • 调用者可以接收命令参数,甚至在运行时动态的进行(动态把命令绑定到调用者遥控器上,并且调用者遥控器是针对接口编程);
    • 命令可以支持undo撤销操作,在调用者(遥控器)上可以记录上一个执行的命令,调用undo撤销上一个命令即可;
    • 命令模式可以实现日志与队列系统:
    日志系统:可以将执行的每个命令记录到日志系统中,当系统崩溃或者死机后,可以根据日志系统的命令在重新执行一遍,对系统进行还原;
    队列系统:工作队列,把实际的工作对象与调用者进行解耦,例如:线程池等;
     
    定义命令接口:用于规范每个命令需要实现的方法
    public interface Command {
        void execute();
        void undo();
    }
    定义 灯类:灯下包括打开 与 关闭 两个命令。
    public class Light {
        private String name;
    
        public Light(String name) {
            this.name = name;
        }
    
        public void on(){
            System.out.println("开灯");
        }
    
        public void off(){
            System.out.println("关灯");
        }
    }
    定义灯命令类:用于封装灯的开灯 与关灯 命令。
    public class LightCommand implements Command {
        private Light light;
    
        public LightCommand(Light light){
            this.light = light;
        }
    
        @Override
        public void execute(){
            light.on();
        }
    
        @Override
        public void undo(){
            light.off();
        }
    }
    定义NoCommand命令,针对遥控器上没有命令的数字按键。
    public class NoCommand implements Command {
    
        public NoCommand(){
    
        }
    
        @Override
        public void execute(){
            System.out.println("没有打开命令");
        }
    
        @Override
        public void undo(){
            System.out.println("没有关闭命令");
        }
    }
    定义遥控器类:
    定义存放命令的数组;
    针对用户的打开与关闭两个命令;
    public class RemoteControl {
        Command[] commands;
    
        public RemoteControl() {
            commands = new Command[10];
            for(int i=0;i<10;i++) {
                commands[i] = new NoCommand();
            }
        }
        public void setCommands(int slot,Command onCommand) {
            commands[slot] = onCommand;
        }
        public void onButton(int slot) {
            commands[slot].execute();
        }
        public void offButton(int slot) {
            commands[slot].undo();
        }
    }
    测试类:
    public class Test {
        public static void main(String[] args) {
            Light light = new Light("电灯");
            LightCommand lightCommand = new LightCommand(light);
            RemoteControl control = new RemoteControl();
            control.setCommands(0,lightCommand);
            control.onButton(0);
            control.offButton(0);
            control.onButton(1);
            control.offButton(1);
        }
    }
    执行结果:
    开灯
    关灯
    没有打开命令
    没有关闭命令
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    微信企业号开发:UserAgent
    用sinopia搭建内部npm服务
    python format用法详解
    python正则表达式re之compile函数解析
    Socket通信原理
    TCP半开连接与半闭连接
    使用npm安装一些包失败了的看过来(npm国内镜像介绍)
    UI优秀框架(库)
    关于 WebView 知识点的详解
    CommonJS规范
  • 原文地址:https://www.cnblogs.com/use-D/p/9749093.html
Copyright © 2020-2023  润新知