命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。这个模式允许我们将动作封装成命令对象,然后可以传递和调用。

  1)命令模式将发出请求的对象和执行请求的对象解耦

  2)在被解耦的两者之间式通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作

  3)调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用

  4)调用者可以接受命令当做参数,甚至在运行时动态地进行

  5)命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态

 Command

/**
* 命令接口
* @author oy
* @date 2019年9月7日 下午10:25:24
* @version 1.0.0
*/
public interface Command {
public void execute();
}

  Light

public class Light {
public void on() {
System.out.println("on,打开电灯");
}
public void off() {
System.out.println("off,关闭电灯");
}
}

  

  LightOnCommand:发出请求的对象,将“动作”封装成命令对象

/**
* 实现打开电灯的命令
* @author oy
* @date 2019年9月7日 下午10:26:28
* @version 1.0.0
*
*/
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}

  LightOffCommand:发出请求的对象,将“动作”封装成命令对象

/**
* 实现关闭电灯的命令
* @author oy
* @date 2019年9月7日 下午10:26:28
* @version 1.0.0
*/
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
}

  SimpleRemoteControl:执行请求的对象

/**
* 遥控器
* @author oy
* @date 2019年9月7日 下午10:31:45
* @version 1.0.0
*/
public class SimpleRemoteControl {
Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) {
slot = command;
} public void buttonWarPressed() {
slot.execute();
}
}

  测试代码

public static void main(String[] args) {
SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
simpleRemoteControl.setCommand(new LightOnCommand(new Light()));
simpleRemoteControl.buttonWarPressed(); simpleRemoteControl.setCommand(new LightOffCommand(new Light()));
simpleRemoteControl.buttonWarPressed(); }

最新文章

  1. Android 5.X新特性之为RecyclerView添加HeaderView和FooterView
  2. 前端 angular 和 bootstrap 的安装步骤
  3. java静态方法调用&&构造函数&&静态块
  4. 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
  5. [系统开发] 一个基于Django和PureCSS的内容管理系统
  6. Linux的set
  7. InnoDB和MyISAM存储引擎的区别
  8. 2015.4.8-C#入门基础(二)
  9. js 禁止重复提交
  10. 原生JavaScript如何解决父元素查找指定类名的子元素的问题
  11. [LeetCode] The Maze III 迷宫之三
  12. easyui,datagrid表格,行内可编辑
  13. Kali Linux ——在无网络情况下安装无线网卡驱动
  14. ubuntu下绑定串口
  15. javascript接口注释法
  16. [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.
  17. Java 经典面试题 —— 性能
  18. HTML5学习笔记(二十):JavaScript中的标准对象
  19. 用 Excel 生成和管理 Markdown 表格--转载
  20. finally 的作用是什么?

热门文章

  1. Linux 常用服务器命令
  2. 纯前端表格控件SpreadJS V12.1 隆重登场,专注易用性,提升用户体验
  3. Python学习【day05】- Python文件处理
  4. 什么是数据传输服务DTS
  5. JAVA基础:接口
  6. Java continue 、break、标签
  7. java中内部类
  8. Three.js类似于波浪的效果
  9. 丑陋的 shell 来一遍
  10. python视频学习笔记5(高级变量的类型)