专栏首页静默虚空的博客JAVA 设计模式 命令模式

JAVA 设计模式 命令模式

用途

命令模式 (Command)

将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化; 对请求排队或请求日志,以及支持可撤销的操作。

命令模式是一种行为型模式

结构

图-命令模式结构图

Command : 用来声明执行操作的接口。

abstract class Command {
 protected Receiver receiver;
 public Command(Receiver receiver) {
 this.receiver = receiver;
     }
 
 public abstract void Execute();
 }

ConcreteCommand : 将一个接收者对象绑定一个动作,调用接收者相应的操作,以实现Execute。

class ConcreteCommand extends Command {
 public ConcreteCommand(Receiver receiver) {
 super(receiver);
     }
 
     @Override
 public void Execute() {
         receiver.Action();
     }
 }

Invoker : 要求该命令执行这个请求。

class Invoker {
 private Command command;
 
 public Invoker(Command command) {
 this.command = command;
     }
 
 public void ExecuteCommand() {
         command.Execute();
     }
 }

Receiver : 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

class Receiver {
 public void Action() {
         System.out.println("执行请求");
     }
 }

Client : 创建一个具体命令对象并设定它的接受者。

public class CommandPattern {
 public static void main(String[] args) {
         Receiver receiver = new Receiver();
         Command cmd = new ConcreteCommand(receiver);
         Invoker invoker = new Invoker(cmd);
         invoker.ExecuteCommand();
     }
 }

交互

图-命令模式交互图

1、Client 创建一个 ConcreteCommand 对象并指定他的 Receiver 对象。 2、某个 Invoker 对象存储该 ConcreteCommand 对象。 3、该 Invoker 通过调用 Command 对象的 Execute 操作来提交一个请求。若该命令是可撤销的,ConcreteCommand 就在执行 Execute 操作之前存储当前状态以用于取消该命令。 4、ConcreteCommand 对象对调用它的 Receiver 的一些操作以执行该请求。

要点

1、命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。 2、每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。 3、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。 4、命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。 5、命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • apt 与 JavaPoet 自动生成代码

    本文通过介绍腾讯视频项目中,adapter 创建 View 的例子,向大家介绍,如何通过自定义注解处理器自动生成代码,以及如何调试自定义注解处理器。首先,介绍一...

    吴涛
  • Java 架构师学习路线

    Java 架构师,首先要是一个高级 java 攻城狮,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得 jvm 能让你写出性能更好的代码;池...

    李鹏
  • 5月 TIOBE 排行榜:Java 和 C 语言正在被超越

    自 2016 年初,Java 和 C 语言就出现了明显的下颓趋势,与去年相比,这两种语言的市场占有率均下滑了 6%有余。根据 TIOBE 的数据显示,原本的 J...

    云资讯小编
  • 35 个 Java 代码性能优化总结

    代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼...

    Java后端工程师
  • 如何快速部署国人开源的 Java 博客系统 Tale

    前几天,在社区看到有国人开发者开源了用 Java 写的一个博客系统 Tale。从作者放出的 Demo 站点来看,效果还是不错的。本书梳理了一下部署 Tale 的...

    EarlGrey
  • Java 虚拟机管理的内存运行时数据区域解释

    Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的...

    李鹏
  • 利用 Jquery + css 自制无限极下拉分类

    网上相关例子基本都是 ztree,然后个人去看了看官网,看了半天没找到合适又简单的,ztree,由于界面不适合项目里面的,要是修改他的样式我还可能出现更多的错误...

    世玉
  • 理解 JDK 中的 MethodHandle

    MethodHandle 更像是在Java语法规则内手写字节码:自己创建方法签名(MethodType),自己决定调用方式,自己注意访问控制 ,最后还要自己决定...

    serena
  • 快速上手 Kotlin 11 招

    这篇文章主要是写给需要快速上手 Kotlin 的 Java 程序员看的,这时候他们关注的是如何 Kotlin 写出类似某些 Java 的写法,所以本文基本不涉及...

    bennyhuo
  • 【 ES 私房菜 】系统运维数据分析平台架构

    网管系统在日常运行过程中会产生各类日志数据,比如 WEB、DB 以及系统等。所以,我们急需一个可以集中收集、分析并输出表报的日志平台,毋庸置疑,ES 就是最佳“...

    张戈

扫码关注云+社区

领取腾讯云代金券