Java行为型模式中命令模式分析

 更新时间:2023年02月17日 08:29:31   作者:非凡的小笨鱼  
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计

一.介绍

命令模式(Command Pattern)属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,执行顺序是调用者→命令→接收者,实现调用者(Invoker)与接收者(Receiver)解耦

二.场景约束

设计一个文本编辑器(TextField),支持复制、插入以及撤销操作

三.UML类图

四.示意代码

业务代码

//抽象命令
public interface Command {
    void execute();
    void undo();
}
//调用者
class Invoker{
    private Command command;
    public Invoker(Command command) {
        this.command = command;
    }
    public void setCommand(Command command) {
        this.command = command;
    }
    public void call(){
        command.execute();
        command.undo();
    }
}
//具体命令
class insertCommand implements Command {
    private TextField textField;
    private String insertStr = "insertStr";
    public insertCommand(TextField textField) {
        this.textField = textField;
    }
    @Override
    public void execute() {
        textField.text += insertStr;
        System.out.println(textField.text);
    }
    @Override
    public void undo() {
        textField.text = textField.text.substring(0, textField.text.length() - insertStr.length());
        System.out.println(textField.text);
    }
}
//具体命令
class CopyCommand implements Command {
    private TextField textField;
    public CopyCommand(TextField textField) {
        this.textField = textField;
    }
    @Override
    public void execute() {
        textField.text += textField.text;
        System.out.println(textField.text);
    }
    @Override
    public void undo() {
        textField.text = textField.text.substring(0, textField.text.length() / 2);
        System.out.println(textField.text);
    }
}
//接收者
class TextField {
    public String text = "text";
}

客户端

public class Client {
    public static void main(String[] args) {
        Invoker invoker = new Invoker(new CopyCommand(new TextField()));
        invoker.call();
    }
}

五.优点

优点

  • 新增、删除命令非常方便
  • 符合开闭原则
  • 命令可以组合,同时支持命令的撤销和恢复
  • 命令可以增加统一功能:日志、权限
  • 调用者与接收者解耦

六.在JDK中的应用

java.lang.Runnable是一个典型的命令模式,Runnable充当抽象命令的角色,Thread充当调用者的角色,而接收者的角色是开发者自己定义的

//具体命令
class ConcreteCommand implements Runnable{
    private Receiver receiver;
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    @Override
    public void run() {
        receiver.execute();
    }
}
//接收者
class Receiver{
    public void execute(){
        System.out.println("执行逻辑");
    }
}

到此这篇关于Java行为型模式中命令模式分析的文章就介绍到这了,更多相关Java命令模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring拦截器和过滤器的区别在哪?

    Spring拦截器和过滤器的区别在哪?

    相信很多小伙伴都对Spring拦截器和过滤器的区别有疑惑,今天特地整理了本篇文章,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • 浅析我对 String、StringBuilder、StringBuffer 的理解

    浅析我对 String、StringBuilder、StringBuffer 的理解

    StringBuilder、StringBuffer 和 String 一样,都是用于存储字符串的。这篇文章谈谈小编对String、StringBuilder、StringBuffer 的理解,感兴趣的朋友跟随小编一起看看吧
    2020-05-05
  • JAVA中Object的常用方法

    JAVA中Object的常用方法

    JAVA中Object是所有对象的顶级父类,存在于java.lang包中,这个包不需要我们手动导包,本文通过实例代码介绍JAVA中Object的常用方法,感兴趣的朋友一起看看吧
    2023-11-11
  • Jmeter3.0发布!版本更新到底更新了什么

    Jmeter3.0发布!版本更新到底更新了什么

    Jmeter3.0发布!版本更新到底更新了什么?这篇文章主要告诉大家Jmeter3.0版本更新了什么,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • eclipse安装spring ide的步骤详解

    eclipse安装spring ide的步骤详解

    这篇文章主要介绍了eclipse安装spring ide的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 浅谈java中String的两种赋值方式的区别

    浅谈java中String的两种赋值方式的区别

    这篇文章主要介绍了浅谈java中String的两种赋值方式的区别。简单介绍了两种赋值方式,然后进行了实例分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java去除数组重复元素的四种方法

    java去除数组重复元素的四种方法

    本文给大家分享四种java去除数组重复元素的方法,每种方法通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • Java虚拟机JVM性能优化(一):JVM知识总结

    Java虚拟机JVM性能优化(一):JVM知识总结

    这篇文章主要介绍了Java虚拟机JVM性能优化(一):JVM知识总结,本文是系列文章的第一篇,后续篇章请继续关注脚本之家,需要的朋友可以参考下
    2014-09-09
  • SpringBoot默认使用HikariDataSource数据源方式

    SpringBoot默认使用HikariDataSource数据源方式

    这篇文章主要介绍了SpringBoot默认使用HikariDataSource数据源方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringMVC利用dropzone组件实现图片上传

    SpringMVC利用dropzone组件实现图片上传

    这篇文章主要介绍了SpringMVC利用dropzone组件实现图片上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论