head first 设计模式笔记6-命令模式
2024-10-04 17:50:34
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。这个模式允许我们将动作封装成命令对象,然后可以传递和调用。
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(); }
最新文章
- Android 5.X新特性之为RecyclerView添加HeaderView和FooterView
- 前端 angular 和 bootstrap 的安装步骤
- java静态方法调用&;&;构造函数&;&;静态块
- 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
- [系统开发] 一个基于Django和PureCSS的内容管理系统
- Linux的set
- InnoDB和MyISAM存储引擎的区别
- 2015.4.8-C#入门基础(二)
- js 禁止重复提交
- 原生JavaScript如何解决父元素查找指定类名的子元素的问题
- [LeetCode] The Maze III 迷宫之三
- easyui,datagrid表格,行内可编辑
- Kali Linux ——在无网络情况下安装无线网卡驱动
- ubuntu下绑定串口
- javascript接口注释法
- [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.
- Java 经典面试题 —— 性能
- HTML5学习笔记(二十):JavaScript中的标准对象
- 用 Excel 生成和管理 Markdown 表格--转载
- finally 的作用是什么?