1.应用场景

有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是什么,将‘对象的请求者‘从’命令的执行者’中解耦。使用此模式的优点还在于,command对象拥有更长的生命周期,可以在程序运行的任何时刻去调用这个方法。

2. 概念

命令设计模式将“请求”封装成对象,以便使用不同的请求队列或者日志来参数化其他对象。命令模式也可以支持撤销的操作。

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

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

3. Class Diagram

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

4. Implementation

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

public interface Command {void execute();
}
public class LightOnCommand implements Command {Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}
}
public class LightOffCommand implements Command {Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic 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

Java设计模式(六):命令设计模式相关推荐

  1. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  2. java 命令设计模式_Java设计模式之命令设计模式

    1.概念 请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 2.场景 工作流Activit框架中就用到了这种模式,它总共 ...

  3. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

  4. [译]Java 设计模式之命令

    (文章翻译自Java Design Pattern: Command) 命令设计模式在进行执行和记录的时候需要一个操作及其参数和封装在一个对象里面.在下面的例子中,命令是一个操作,它的参数是一个Com ...

  5. java.io设计模式_Java IO文件过滤器对命令设计模式的使用

    一. 点睛 java io流里面使用到了很多的设计模式,最典型的就是装饰模式,还有命令模式.通过对文件过滤器功能的简单使用,可以一窥java io流对命令设计模式的典型使用.下面分两部分来讲,先举例说 ...

  6. java与23种设计模式

    1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...

  7. Java进阶 23种设计模式 详解+应用+实例代码

    文章目录 前言 设计模式六大原则 1.单一原则 (1) 概念 (2) 优点 2.开闭原则 (1) 概念 3.里氏替换原则 (1) 概念 4.依赖倒置原则 (1) 概念 (2) 作用 5.接口隔离原则 ...

  8. 设计模式篇之——命令设计模式

    命令设计模式很多人看了官方的文档是不够清晰的,甚至看了一遍基本记不住,说简单的谈不上,说难的话就那么一点代码,所以思想很重要,经过自己摸索后的一些理解,本文用最形象深刻的例子来带大家深刻理解命令设计模 ...

  9. 设计模式 之 命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...

最新文章

  1. python【数据结构与算法】最短路算法之FloyedDijkstra
  2. 人生苦短,Let's Go!
  3. c++ mmap写入速度_内存管理(24)mmap和缺页中断
  4. 数据结构(十三)树的遍历
  5. ANSI,Unicode,UTF-8网页编码的区别【转】
  6. DevOps敏捷60问,一定有你想了解的问题
  7. SQL 2016 性能调优培训来了!!! 还免费!!!
  8. iphone通知和android,手机App 通知数量太多,让你备感压力吗?教你如何消除令人心烦的信息通知(iPhone、Android)...
  9. centos7 源码安装redis
  10. (转)任正非圣诞文章:千古兴亡多少事,一江春水向东流,为轮值CEO鸣锣开道...
  11. android 播放器 下载,VPlayer安卓最新版
  12. java adt包_adt下载(Android开发工具)adt离线安装包大集合下载 - 3322软件站
  13. 20多岁的生活方式决定了你30岁的打开方式_演讲稿
  14. python刷视频挣钱_薅羊毛--使用python+adb实现自动刷视频点赞
  15. GDPR对ITSM的影响
  16. kalibr编译 error: ‘Eigen::MatrixBase<Derived>::~Matrix
  17. 双通道矩阵式8口高清 IP KVM切换器 型号 : HT1108
  18. MATLAB 回归分析
  19. 【Linux】Linux命令英文全称解释
  20. CentOS7服务器搭建百度贴吧云签到

热门文章

  1. java模拟post请求,HttpURLConnection--代码积累
  2. EOS绑定以太坊地址
  3. 05构建之法阅读笔记之三
  4. vuejs和webpack项目(VueComponent)初尝试——瀑布流组件
  5. img元素高度多出来的几像素
  6. Go to sleep
  7. 做人不能太忽悠 评淘宝团购 续集
  8. hht时频谱 matlab 乱序_频谱、能量谱、功率谱的区别与联系
  9. adcclk最大_STM32 ADC转换时间
  10. mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)