定义

将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。

UML图:

角色
Command:定义命令的接口,声明执行的方法。
ConcreteCommand:命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client:创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。

总的调用顺序是:

请求者持有命令对象,调用命令对象的方法,命令对象持有接受者,进而调用接受者的执行方法。

适用情况
1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。

简单命令模式

package com.hust.command1;
//接收者类
public class Receiver {//真正执行命令逻辑的方法public  void action(){System.out.println("执行具体操作!");}
}
/*** */
package com.hust.command1;/*** 抽象命令接口**/
public interface Command {//执行具体操作的命令void execute();
}
package com.hust.command1;
//具体命令类
public class ConcreteCommand implements Command {private  Receiver  receiver;//接收者作为成员变量public ConcreteCommand(Receiver  receiver){this.receiver=receiver;}//调用接收者的相关方法来执行具体逻辑public void execute() {      receiver.action();}}
/*** */
package com.hust.command1;/*** 请求者类**/
public class Invoker {private Command command;//命令对象做成员变量public Invoker(Command command){this.command=command;}public void action(){//调用命令对象的相关方法,执行具体命令command.execute();}
}
package com.hust.command1;public class Client {/*** @param args*/public static void main(String[] args) {//构造一个接收者对象Receiver receiver=new Receiver();//构造一个命令对象Command command=new ConcreteCommand(receiver);//构造一个请求者对象,去请求命令对象,命令对象在去执行操作Invoker invoker=new Invoker(command);invoker.action();}}

俄罗斯方块游戏,有4个按钮,两个左右移动按钮,一个快速下落按钮,一个变形按钮

一个玩游戏的人是相当于客户端,而游戏上的4个按钮就相当于请求者,执行具体按钮命令的逻辑方法可以看作是命令角色。

/*** */
package com.hust.shutdown;/*** @author Administrator**/
public class TetrisMachine {//俄罗斯方块//真正处理“向左”操作的逻辑代码public void toLeft(){System.out.println("向左");}//真正处理“向右”操作的逻辑代码public void toRight(){System.out.println("向右");}//真正处理“快速落下”操作的逻辑代码public void fastToButtom(){System.out.println("快速落下");}//真正处理“改变形状”操作的逻辑代码public void transform(){System.out.println("改变形状");}
}
/*** */
package com.hust.shutdown;/*** 抽象命令接口**/
public interface Command {//执行具体操作的命令void execute();
}
package com.hust.shutdown;public class LeftCommand implements Command {//接收者俄罗斯方块private TetrisMachine machine;public LeftCommand(TetrisMachine machine) {super();this.machine = machine;}public void execute() {// 调用游戏机的具体方法执行操作machine.toLeft();}}
package com.hust.shutdown;public class RightCommand implements Command {//接收者俄罗斯方块private TetrisMachine machine;public RightCommand(TetrisMachine machine) {super();this.machine = machine;}public void execute() {// 调用游戏机的具体方法执行操作machine.toRight();}
}
package com.hust.shutdown;public class FallCommand implements Command {//接收者俄罗斯方块private TetrisMachine machine;public FallCommand(TetrisMachine machine) {super();this.machine = machine;}public void execute() {// 调用游戏机的具体方法执行操作machine.fastToButtom();}}

Java设计模式-命令模式Command相关推荐

  1. 设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

  2. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  3. 解读设计模式----命令模式(Command Pattern)

    ***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.as ...

  4. 设计模式-命令模式(Command)

    关注公众号 JavaStorm 获取更多成长. 大约需要6分钟读完.建议收藏后阅读. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日 ...

  5. JAVA 设计模式—————— 命令模式和职责链模式

    学习 Netty 前的准备工作!! 这里,还是先来复习一下 OOP (面向对象)的七大原则: 开闭原则:对扩展开放,对修改关闭 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立. 依赖倒置原 ...

  6. JAVA设计模式--命令模式

    目录 一.什么是命令式 二.命令模式的适用性 三.命令模式的结构 四.命令模式的优点 五.认识命令模式 六.总结 一.什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Tr ...

  7. Java设计模式-命令模式

    命令模式   在软件开发系统中,常常出现"方法的请求者"与"方法的实现者"之间存在紧密的耦合关系.这不利于软件功能的扩展与维护.例如,想对行为进行"撤 ...

  8. java设计模式---命令模式

    1.概念 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化. ...

  9. C++设计模式--命令模式(Command)

    概述 命令模式的结构很简单,但是对于消除代码间的耦合却有着重要的影响.命令模式就是一个函数对象:一个作为对象的函数.通过将函数封装为对象,就能够以参数的形式将其传递给其他函数或者对象,告诉它们在旅行请 ...

最新文章

  1. 分布式系统性能监控工具,初探Pinpoint Agent启动源码
  2. 深度学习与计算机视觉:基于Python的神经网络的实现
  3. 【Spring注解系列06】FactoryBean注入对象用法
  4. SAP WebClient UI开发工具中attribute文件夹展开的实现原理分析
  5. linux基础网络设置
  6. 今天的俩个一齐说的即时通讯
  7. tomcat架构分析(容器类)
  8. getopt与getopt_long
  9. 手写springboot
  10. 如何实现幻灯片效果/图片轮播
  11. 爱分析·中国采购数字化行业趋势报告
  12. 超文本标记语言--Html
  13. 从Python爬虫到Spark预处理数据的真实需求[四]
  14. Python新手-记一次股权穿透层级打分(森林实现)
  15. 【APP本地化】提高APP下载量的 5 个技巧
  16. JAVA WEB之XSS防御工具类代码示例
  17. 海量数据处理方法总结 常见大数据题目汇总
  18. tableau制作人口金字塔图/旋风图
  19. 读论文|基于大平面物体垂直姿态的双向人机双手交接
  20. 奔腾PLFE5001电压力锅

热门文章

  1. STM32下载程序时的一个奇怪现象
  2. C++ 虚拟析构函数
  3. 图形基础 GPU架构(5)并行计算
  4. C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问
  5. 近世代数--群同构--第二同构定理
  6. Linux Kernel 5.14 arm64异常向量表解读-中断处理解读
  7. vc 限制软件的使用次数或时间
  8. IDC dump 内存
  9. ReverseMe-120(base64解码表) 逆向寒假生涯(21/100)
  10. easyre-153 testre寒假逆向生涯(13/100)