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命令模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JavaConfig代替xml实现Spring配置操作

    使用JavaConfig代替xml实现Spring配置操作

    这篇文章主要介绍了使用JavaConfig代替xml实现Spring配置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java通过切面实现统一处理Token设置用户信息

    Java通过切面实现统一处理Token设置用户信息

    这篇文章主要介绍了Java切面统一处理Token设置用户信息,常见的后端开发中,接口请求中一般前端都是先通过用户登录获取token,每次接口请求都需要在头信息中携带token信息,后端每次都需要手动处理token信息,从token信息中解析获取用户信息,需要的朋友可以参考下
    2023-10-10
  • SSH框架网上商城项目第22战之银行图标以及支付页面显示

    SSH框架网上商城项目第22战之银行图标以及支付页面显示

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第22战之银行图标以及支付页面显示,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java中的WeakHashMap源码分析

    Java中的WeakHashMap源码分析

    这篇文章主要介绍了Java中的WeakHashMap源码分析,WeakHashMap可能平时使用的频率并不高,但是你可能听过WeakHashMap会进行自动回收吧,下面就对其原理进行分析,需要的朋友可以参考下
    2023-09-09
  • IDEA-SpringBoot项目Debug启动不了(卡住不动)的原因分析

    IDEA-SpringBoot项目Debug启动不了(卡住不动)的原因分析

    这篇文章主要介绍了IDEA-SpringBoot项目Debug启动不了(卡住不动)的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MybatisPlus自定义Sql实现多表查询的示例

    MybatisPlus自定义Sql实现多表查询的示例

    这篇文章主要介绍了MybatisPlus自定义Sql实现多表查询的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 基于Properties实现配置数据库驱动

    基于Properties实现配置数据库驱动

    这篇文章主要介绍了基于Properties实现配置数据库驱动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • JDK9对String字符串的新一轮优化

    JDK9对String字符串的新一轮优化

    这篇文章主要介绍了JDK9对String字符串的新一轮优化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java并发编程之原子性、可见性、有序性

    java并发编程之原子性、可见性、有序性

    这篇文章主要给大家分享的是java并发编程的原子性、可见性和有序性,文章会具体举例说明,感兴趣的小伙伴可以参考一下文章的具体内容
    2021-09-09
  • Maven热部署devtools的实现示例

    Maven热部署devtools的实现示例

    本文主要介绍了Maven热部署devtools的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论