当前位置: 首页 > news >正文

设计模式系列(图文解析,附带源码) - 命令

2. 命令(Command)

Intent

将命令封装成对象中,具有以下作用:

  • 使用命令来参数化其它对象
  • 将命令放入队列中进行排队
  • 将命令的操作记录到日志中
  • 支持可撤销的操作

Class Diagram

  • Command:命令
  • Receiver:命令接收者,也就是命令真正的执行者
  • Invoker:通过它来调用命令
  • Client:可以设置命令与命令的接收者

Implementation

设计一个遥控器,可以控制电灯开关。


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();
    }
}
public class Light {

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

    public void off() {
        System.out.println("Light is off!");
    }
}
/**
 * 遥控器
 */
public class Invoker {
    private Command[] onCommands;
    private Command[] offCommands;
    private final int slotNum = 7;

    public Invoker() {
        this.onCommands = new Command[slotNum];
        this.offCommands = new Command[slotNum];
    }

    public void setOnCommand(Command command, int slot) {
        onCommands[slot] = command;
    }

    public void setOffCommand(Command command, int slot) {
        offCommands[slot] = command;
    }

    public void onButtonWasPushed(int slot) {
        onCommands[slot].execute();
    }

    public void offButtonWasPushed(int slot) {
        offCommands[slot].execute();
    }
}
public class Client {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        Light light = new Light();
        Command lightOnCommand = new LightOnCommand(light);
        Command lightOffCommand = new LightOffCommand(light);
        invoker.setOnCommand(lightOnCommand, 0);
        invoker.setOffCommand(lightOffCommand, 0);
        invoker.onButtonWasPushed(0);
        invoker.offButtonWasPushed(0);
    }
}

JDK

  • java.lang.Runnable
  • Netflix Hystrix
  • javax.swing.Action

相关文章:

  • 设计模式系列(图文解析,附带源码) - 模板方法
  • 设计模式系列(图文解析,附带源码) - 生成器
  • 设计模式系列(图文解析,附带源码) - 适配器
  • 一文搞定设计模式!五万字超详细解析!带着耐心点进来!
  • 一个系列搞定MyBatis:MyBatis配置动态SQL语句基础
  • 一个系列搞定MyBatis:MyBatis快速上手增删改查
  • 一个系列搞定MyBatis:Mybatis多表查询
  • PropertyPlaceholderConfigurer 用法超详细解析!
  • JavaFX之WebView超详细解析!
  • javafx之webEngine超详细解析
  • mybatis-plus进阶教程!超详细使用方法解析!
  • mybatis-plus入门教程!看完必懂!超详细解析!
  • Mybatis-Plus中的代码生成器AutoGenerator超详细解析!完整配置!
  • Mybatis plus关闭驼峰命名,防止出现查询为Null!四种方法超详细解析!
  • Spring体系结构超详细解析!
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • __proto__ 和 prototype的关系
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • codis proxy处理流程
  • JavaScript 奇技淫巧
  • JavaScript设计模式之工厂模式
  • Java方法详解
  • Js基础知识(四) - js运行原理与机制
  • miaov-React 最佳入门
  • MYSQL 的 IF 函数
  • React-Native - 收藏集 - 掘金
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Zsh 开发指南(第十四篇 文件读写)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分享几个不错的工具
  • 来,膜拜下android roadmap,强大的执行力
  • 驱动程序原理
  • 少走弯路,给Java 1~5 年程序员的建议
  • 项目实战-Api的解决方案
  • 写给高年级小学生看的《Bash 指南》
  • 因为阿里,他们成了“杭漂”
  • 7行Python代码的人脸识别
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​TypeScript都不会用,也敢说会前端?
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)WCF的Binding模型
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm电影分享网站
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)ORM