命令模式
时间:2019-12-14
本文章向大家介绍命令模式,主要包括命令模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述:
命令模式:将一组行为抽象成对象,实现“行为请求者”和“行为执行者”之间松耦合。
按照《Head First 设计模式》中命令模式章节中的例子。一个遥控器,分为左右两排按钮,左边开,右边关,最后一个按钮为撤销上一次的操作。当我想要开灯的时候,就要按下左边第一个按钮,关灯则要按右边第一个按钮。
此时,我们可以把 开灯、关灯 这些命令(行为),抽象成一个个对象。使行为请求者(我)持有 这些 命令对象,当我想要开灯,就调用“开灯” 这个对象,这个对象就会帮助我们开灯,而我不需要关注它是怎么帮我开灯的。
关系图:
具体的代码实现(以“开灯”为例):
public interface Command { //这是抽象的命令的接口 void execute(); //执行 void undo(); //撤销 }
public class LightOnCommand implements Command { //开灯命令 具体的实现类 Light light; //行为执行者 public LightCommand(Light light){ this.light = light; } @Override public void execute() { light.lightOn(); //开灯 } public void undo(){ light.lightOff(); //撤销开灯的操作 -- 关灯。。。 } }
public class Controller { //行为请求者
Command command; //持有命令对象 public void setCommand(Command command){ this.command = command; // } public void buttonOnPress(){ command.execute(); //调用命令对象的execute() } public void back(){ command.undo(); //调用命令对象的undo() } }
public class Light { //行为执行者 public void lightOn(){ System.out.println("light on"); } public void lightOff(){ System.out.println("light off"); } }
接下来就是测试代码:
public class Test { public static void main(String[] args) { Controller controller = new Controller(); Light light = new Light(); LightOnCommand lightCommand = new LightOnCommand(light); //传入行为执行者 controller.setCommand(lightCommand); //传入命令对象 controller.buttonOnPress(); //开灯 controller.back(); //撤销开灯操作 } }
控制台输出如下:
light on light off
这样,我就可以通过 LightOnCommand 来开灯了!
如果想要打开电视,也是同理 , 创建 TelevisionCommond ,实现 Commond接口的方法 即可。
关于宏命令:假设,此时添加了一个按钮,要求一键 开灯、开电视。那么我们可以把 开灯、开电视的命令对象 都交给这个新的命令。
public class OpenAllCommand implements Command { Command[] commands; //可以用数组的形式保存这些命令对象 public OpenAllCommand(Command[] commands){ this.commands = commands; } @Override public void execute() { for (int i = 0;i<commands.length;i++) { commands[i].execute(); } } @Override public void undo() { for (int i = 0;i<commands.length;i++) { commands[i].undo(); } } }
测试:
public class Test { public static void main(String[] args) { Controller controller = new Controller(); Light light = new Light(); LightOnCommand lightCommand = new LightOnCommand(light); TelevisionCommond televisionCommond = new TelevisionCommond(new Television()); Command[] commands = new Command[]{lightCommand,televisionCommond}; OpenAllCommand openAllCommand = new OpenAllCommand(commands);
controller.setCommand(openAllCommand); //使行为执行者持有命令对象 controller.buttonOnPress(); } }
控制台输出:
light on Turn on the TV
OK!
总结:
命令模式实现了 行为请求者和行为执行者之间的解耦,还可以在执行的时候动态的添加新的命令。
但是,有可能会创建非常多的命令对象。。
PS:有错误之处,还请指出,谢谢!!! 自学不久,经验不足,还请多多包涵,感谢您的观看!
2019-12-14 16:44:45
原文地址:https://www.cnblogs.com/zwb1/p/12040111.html
- 关于ora-02391问题的总结(r6笔记第40天)
- 一次数据库响应慢的问题诊断(r6笔记第39天)
- 贝叶斯分类器及Python实现
- R语言中文分词工具
- orabbix结合python发送图形报表(二) (r6笔记第38天)
- 14(01)正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等
- oracle的TAF浅析 (r6笔记第37天)
- R语言高级绘图命令(标题-颜色等)
- 14(02)正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等
- R语言 判别分析
- Apache、struts1、struts2文件上传下载的3种方式
- 解析实时的DB time过程分析(r6笔记第35天)
- sql嵌入html格式显示报表(r6笔记第34天)
- hive计算日期差函数datediff,hive修改日期连接符
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 学习笔记(1)——python中的lambda函数用法
- SpringBoot过滤器的简单使用
- SpringBoot拦截器的简单使用
- dotNET Core:编码规范
- K8s——Ingress-nginx原理及配置
- Java的类加载器
- 如何启动HiveServer2
- dotnet 如何调试 SmartSql 的实际执行 SQL 语句
- dotnet 关于 SmartSql 的 SQL 语句的属性替换前缀说明
- 为什么java初学者要学习一点前端技术?
- Expedition (POJ 2431)
- java JVM 报C [libresolv.so.2+0x7e7d] __libc_res_nquery+0x4dd 解决
- Fence Repair (PKU 3253)
- JAVA 初学者的编码规范一:命名风格与代码格式
- Leetcode No.11 盛最多水的容器