Java以命令模式设计模式

 更新时间:2021年09月02日 15:48:58   作者:No_Game_No_Life_  
这篇文章主要详细的介绍Java以命令的模式设计模式,是用场景、优缺点等都作有详细介绍,需要的朋友请具体参考下面文章内容

Java以命令模式设计模式

1、简单介绍

意图:

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

主要解决:

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

何时使用:

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

如何解决:

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

关键代码:定义三个角色

  • received 真正的命令执行对象
  • Command
  • invoker 使用命令对象的入口

应用实例:

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

优点:

  • 降低了系统耦合度。
  • 新的命令可以很容易添加到系统中去。

缺点:

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

使用场景:

认为是命令的地方都可以使用命令模式,比如:

  • GUI 中每一个按钮都是一条命令。
  •  模拟 CMD。

注意事项:

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

2、命令模式

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

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其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!

相关文章

  • Spring Cloud构建Eureka应用的方法

    Spring Cloud构建Eureka应用的方法

    这篇文章主要介绍了Spring Cloud构建Eureka应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • SpringBoot部署SSL证书(JKS格式)

    SpringBoot部署SSL证书(JKS格式)

    文将介绍如何在Spring Boot应用中部署SSL证书,以实现安全传输和保护数据隐私,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • binarySearch在java的查找实例用法

    binarySearch在java的查找实例用法

    在本篇文章里小编给大家整理的是一篇关于binarySearch在java的查找实例用法,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • 解决idea中maven项目无端显示404错误的方法

    解决idea中maven项目无端显示404错误的方法

    这篇文章主要介绍了解决idea中maven项目无端显示404错误的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java 序列化详解及简单实现实例

    Java 序列化详解及简单实现实例

    这篇文章主要介绍了 Java 序列化详解及简单实现实例的相关资料,使用序列化目的:以某种存储形式使自定义对象持久化,将对象从一个地方传递到另一个地方,需要的朋友可以参考下
    2017-03-03
  • 带你走进Maven的大门-最全Maven配置及集成idea工具总结

    带你走进Maven的大门-最全Maven配置及集成idea工具总结

    Maven项目对象模型(POM),是一个项目管理工具可以通过一小段描述信息来管理项目的构建,报告和文档的软件.那我们想要在IDEA中使用Maven得进行一些配置,接下来我们具体看一下是如何配置使用的,需要的朋友可以参考下
    2021-06-06
  • Java基于zxing生成二维码矩阵过程解析

    Java基于zxing生成二维码矩阵过程解析

    这篇文章主要介绍了Java基于zxing生成二维码矩阵过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 实例分析Try {} Catch{} 作用

    实例分析Try {} Catch{} 作用

    本文是通过一个简单的实例,向大家介绍了Try {} Catch{}的意义和作用,非常的实用,有需要的小伙伴可以参考下。
    2015-10-10
  • Java堆&优先级队列示例讲解(下)

    Java堆&优先级队列示例讲解(下)

    这篇文章主要通过示例详细为大家介绍Java中的堆以及优先级队列,文中的示例代码讲解详细,对我们了解java有一定帮助,需要的可以参考一下
    2022-03-03
  • Java日期时间类(Date、DateFormat、Calendar)解析

    Java日期时间类(Date、DateFormat、Calendar)解析

    这篇文章主要介绍了Java日期时间类(Date、DateFormat、Calendar)解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06

最新评论