详解Java设计模式——命令模式

 更新时间:2019年04月03日 08:35:39   作者:No_Game_No_Life_  
这篇文章主要介绍了Java设计模式——命令模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

命令模式

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:

Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:

public interface Command { 
  public void exe(); 
} 
public class MyCommand implements Command { 
 
  private Receiver receiver; 
   
  public MyCommand(Receiver receiver) { 
    this.receiver = receiver; 
  } 
 
  @Override 
  public void exe() { 
    receiver.action(); 
  } 
} 
public class Receiver { 
  public void action(){ 
    System.out.println("command received!"); 
  } 
} 
public class Invoker { 
   
  private Command command; 
   
  public Invoker(Command command) { 
    this.command = command; 
  } 
 
  public void action(){ 
    command.exe(); 
  } 
} 
public class Test { 
 
  public static void main(String[] args) { 
    Receiver receiver = new Receiver(); 
    Command cmd = new MyCommand(receiver); 
    Invoker invoker = new Invoker(cmd); 
    invoker.action(); 
  } 
} 

这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!

介绍

意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

以上所述是小编给大家介绍的Java设计模式——命令模式详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java SPI机制详细介绍

    Java SPI机制详细介绍

    大家好,本篇文章主要讲的是Java SPI机制详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • MyBatis高级映射ResultMap解决属性问题

    MyBatis高级映射ResultMap解决属性问题

    对于数据库中对表的增删改查操作,我们知道增删改都涉及的是单表,而只有查询操作既可以设计到单表操作又可以涉及到多表操作,所以对于输入映射parameterType而言是没有所谓的高级映射的,也就是说高级映射只针对于输出映射
    2023-02-02
  • Java异常分类以及几种处理机制分析讲解

    Java异常分类以及几种处理机制分析讲解

    在Java的广阔宇宙中,有一群特殊的“超级英雄”,它们在代码世界中穿梭,守护着程序的正常运行——它们就是“异常”,这些英雄们,各司其职,保护着程序免受错误的侵扰,今天,我们将深入这个神秘的世界,全面解析异常的分类,掌握异常的处理机制
    2024-07-07
  • Java 报错 java.util.ConcurrentModificationException: null 的原因及解决方案

    Java 报错 java.util.ConcurrentModificationException: null 

    这篇文章主要介绍了Java 报错 java.util.ConcurrentModificationException: null 的原因和解决方案,这个异常通常在多线程环境下出现,意味着在迭代过程中,集合或者映射的结构发生了变化,本文分享完美解决方案,需要的朋友可以参考下
    2023-07-07
  • 如何通过properties文件配置web.xml中的参数

    如何通过properties文件配置web.xml中的参数

    这篇文章主要介绍了如何通过properties文件配置web.xml中的参数方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解SpringSecurity处理会话管理和注销功能

    详解SpringSecurity处理会话管理和注销功能

    本文介绍了详解SpringSecurity处理会话管理和注销功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Java中的线程私有变量ThreadLocal详解

    Java中的线程私有变量ThreadLocal详解

    这篇文章主要介绍了Java中的线程私有变量ThreadLocal详解,ThreadLoalMap是ThreadLocal中的一个静态内部类,类似HashMap的数据结构,但并没有实现Map接口,需要的朋友可以参考下
    2023-08-08
  • 详解IDEA2020新建spring项目和c3p0连接池的创建和使用

    详解IDEA2020新建spring项目和c3p0连接池的创建和使用

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,本文就使用Spring实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • mybatis接口绑定失效的解决

    mybatis接口绑定失效的解决

    这篇文章主要介绍了mybatis接口绑定失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java数据结构之选择排序算法的实现与优化

    Java数据结构之选择排序算法的实现与优化

    选择排序:(Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。本文主要为大家介绍一下选择排序的实现与优化,希望对大家有所帮助
    2023-01-01

最新评论