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

 更新时间:2021年04月27日 14:37:37   作者:在下木子李  
这篇文章主要介绍了Java设计模式之命令模式详解,文中有非常详细的代码示例,对正在学习Java的小伙伴们有非常好的帮助,需要的朋友可以参考下

命令模式

定义:将请求封装成对象,这可以让你使用不同的请求、队列、或者日志来参数化其他对象。

何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。

在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。

调用者通过调用命令对象的execute()方法发出请求,这会使接收者的动作被调用。

调用者可以接收命令当作参数,甚至在运行时动态地进行。

优点:

1、降低了系统耦合度。

2、新的命令可以很容易添加到系统中去。

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

实现案例

需求:实现一个遥控器类,遥控器有多组开/关按钮,每组按钮控制一个电器对象的开和关。使用命令模式实现整个功能。

1、创建命令接口

package com.example.designpatternsdemo.commandPattern;

/**
 * 命令接口
 */
public interface Command {
    public void execute();
}

2、创建电灯、电视类(命令接收者)

package com.example.designpatternsdemo.commandPattern;

/**
 * 电灯
 */
public class Light {
	//on/off动作
    public void on(){
        System.out.println("开启电灯");
    }
    public void off(){
        System.out.println("关闭电灯");
    }
}
package com.example.designpatternsdemo.commandPattern;

/**
 * 电视
 */
public class TV {
    public void on(){
        System.out.println("开启电视");
    }

    public void off(){
        System.out.println("关闭电视");
    }
}

3、创建具体命令类

package com.example.designpatternsdemo.commandPattern;

/**
 * 开启电灯命令类
 */
public class LightOnCommand implements Command{
    //电灯对象
    private Light mLight;

    public LightOnCommand(Light light){
        this.mLight = light;
    }
    @Override
    public void execute() {
        mLight.on();
    }
}
package com.example.designpatternsdemo.commandPattern;

/**
 * 关闭电灯命令类
 */
public class LightOffCommand implements Command{
    //电灯对象
    private Light mLight;

    public LightOffCommand(Light light){
        this.mLight = light;
    }
    @Override
    public void execute() {
        mLight.off();
    }
}

这里省略电视的开关命令类

4、创建遥控器类

package com.example.designpatternsdemo.commandPattern;

/**
 * 命令调用者
 * 遥控器
 */
public class RemoteControl {
    //保存开关命令对象的数组
    Command[] onCommands;
    Command[] offCommands;

    public RemoteControl(){
        //初始化数组
        onCommands = new Command[2];
        offCommands = new Command[2];
    }

    //存储命令
    public void setCommand(int index,Command onCommand,Command offCommand){
        onCommands[index] = onCommand;
        offCommands[index] = offCommand;
    }
    //开按钮
    public void onButtonPress(int btnIndex){
        onCommands[btnIndex].execute();
    }

    //关按钮
    public void offButtonPress(int btnIndex){
        offCommands[btnIndex].execute();
    }
}

5、创建客户类(测试类)

package com.example.designpatternsdemo.commandPattern;

public class Client {

    public static void main(String[] args) {
        //创建电灯对象(命令接收者)
        Light myLight = new Light();
        //创建电灯开关命令对象
        LightOnCommand lightOnCommand = new LightOnCommand(myLight);
        LightOffCommand lightOffCommand = new LightOffCommand(myLight);
        //创建遥控器对象(命令调用者)
        RemoteControl remoteControl = new RemoteControl();
        //设置命令
        remoteControl.setCommand(0,lightOnCommand,lightOffCommand);
        //发起命令执行请求
        remoteControl.onButtonPress(0);
        remoteControl.offButtonPress(0);

        TV myTv = new TV();
        TvOnCommand tvOnCommand = new TvOnCommand(myTv);
        TvOffCommand tvOffCommand = new TvOffCommand(myTv);
        remoteControl.setCommand(1,tvOnCommand,tvOffCommand);
        remoteControl.onButtonPress(1);
        remoteControl.offButtonPress(1);
    }
}

将开/关电灯、电视的请求封装成命令类对象,在类中的execute()方法调用具体电灯/电视的开关动作,调用时,遥控器类(命令调用者)只需调用具体某个命令对象的execute()方法,那他就会通知具体的电器来执行动作,这样,就实现了命令调用者和执行者之间的解耦。调用者不需要知道是谁执行动作,只需要调用命令对象的execute()方法去通知执行就可以。

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

相关文章

  • springboot+webmagic实现java爬虫jdbc及mysql的方法

    springboot+webmagic实现java爬虫jdbc及mysql的方法

    今天小编就为大家分享一篇springboot+webmagic实现java爬虫jdbc及mysql的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 分析java 中AspectJ切面执行两次的原因

    分析java 中AspectJ切面执行两次的原因

    这篇文章主要介绍了分析java 中AspectJ切面执行两次的原因的相关资料,希望通过本能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java利用深度搜索解决数独游戏详解

    Java利用深度搜索解决数独游戏详解

    数独是一项非常简单的任务。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。本文将利用Java编写一个程序来解决给定的数独任务,感兴趣的可以动手尝试一下
    2022-08-08
  • 详解Spring加载Properties配置文件的四种方式

    详解Spring加载Properties配置文件的四种方式

    这篇文章主要介绍了详解Spring加载Properties配置文件的四种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • MybatisPlus自动填充创建(更新)时间问题

    MybatisPlus自动填充创建(更新)时间问题

    在开发数据库相关应用时,手动设置创建和更新时间会导致代码冗余,MybatisPlus提供了自动填充功能,通过实现MetaObjectHandler接口并重写insertFill、updateFill方法,可以自动维护创建时间、更新时间等字段,极大简化了代码,这不仅提高了开发效率,也保证了数据的可追溯性
    2024-09-09
  • java后端操作树结构的案例代码

    java后端操作树结构的案例代码

    这篇文章主要介绍了java后端操作树结构,树结构的三种组装方式(递归.双层for循环,map),通过实例代码介绍了使用递归查询某个节点所在的树结构,需要的朋友可以参考下
    2023-10-10
  • 如何用好Java枚举让你的工作效率飞起来

    如何用好Java枚举让你的工作效率飞起来

    在JDK1.5之前没有枚举类型,那时候一般用接口常量来替代,而使用Java枚举类型enum可以更贴近地表示这种常量,下面这篇文章主要给大家介绍了关于如何用好Java枚举让你的工作效率飞起来的相关资料,需要的朋友可以参考下
    2021-09-09
  • Spring事务@Transactional注解四种不生效案例场景分析

    Spring事务@Transactional注解四种不生效案例场景分析

    这篇文章主要为大家介绍了Spring事务@Transactional注解四种不生效的案例场景示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • SpringBoot实现阿里云短信接口对接的示例代码

    SpringBoot实现阿里云短信接口对接的示例代码

    这篇文章主要介绍了SpringBoot实现阿里云短信接口对接的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java 详细讲解线程的状态及部分常用方法

    Java 详细讲解线程的状态及部分常用方法

    在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了,本篇来讲解Java线程的状态以及部分常用方法
    2022-04-04

最新评论