首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JAVA设计模式15:命令模式,将请求封装为对象,达到读写分离的效果

JAVA设计模式15:命令模式,将请求封装为对象,达到读写分离的效果

作者头像
Designer 小郑
发布于 2023-10-26 08:40:57
发布于 2023-10-26 08:40:57
47000
代码可运行
举报
文章被收录于专栏:跟着小郑学JAVA跟着小郑学JAVA
运行总次数:0
代码可运行

作者主页Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。


一、什么是命令模式

命令模式是一种行为型设计模式,它将请求封装为对象,使得发送请求的对象和接收请求的对象分离开来。在命令模式中,将一个请求封装成一个对象,这个对象包含了请求的具体信息和执行该请求所需要的方法。通过将请求封装成对象,可以将请求的发送者和接收者解耦,从而使得请求的发送者不需要知道请求是如何被处理的。

在命令模式中,主要包含以下

5

个角色。

  1. 命令:定义一个命令的接口,包含了执行命令的方法。
  2. 具体命令:实现命令接口,将一个接收者与一个动作绑定起来,调用接收者相应的操作来实现命令的执行。
  3. 接收者:执行命令所需要的操作,具体实现命令中定义的方法。
  4. 调用者:通过命令对象来执行请求,调用者并不知道具体的命令实现细节,只知道调用命令对象的方法来执行命令。
  5. 客户端:创建具体的命令对象并设置其接收者,将命令对象传递给调用者来执行命令。

命令模式的核心思想是将请求封装为对象,从而实现请求的发送者和接收者的解耦。通过使用命令模式,可以方便地实现命令的撤销、重做、记录日志等功能。同时,命令模式也可以很好地支持扩展,可以方便地新增命令和接收者,而无需修改现有的代码。


二、命令模式实例

以下是一个简单的Java代码示例,演示了如何使用命令模式实现一个简单的遥控器控制电灯的开关操作,请同学们认真学习。

首先,我们定义命令接口 Command,其中包含了执行命令的方法 execute(),代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Command {
    void execute();
}

接下来,我们创建具体的命令类,其中包含了对应的接收者,即电灯对象,以及执行具体操作的方法,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOn();
    }
}

public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOff();
    }
}

接着,我们创建接收者类 Light,其中包含了具体的开关操作,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Light {
    public void turnOn() {
        System.out.println("Light is turned on");
    }

    public void turnOff() {
        System.out.println("Light is turned off");
    }
}

然后,我们创建调用者类 RemoteControl,用于执行命令操作,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

最后,我们创建客户端类来测试命令模式的使用,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Light light = new Light();

        // 创建具体的命令对象并设置接收者
        Command lightOnCommand = new LightOnCommand(light);
        Command lightOffCommand = new LightOffCommand(light);

        // 创建调用者对象
        RemoteControl remoteControl = new RemoteControl();

        // 设置命令对象
        remoteControl.setCommand(lightOnCommand);

        // 执行命令
        remoteControl.pressButton();

        // 设置另一个命令对象
        remoteControl.setCommand(lightOffCommand);

        // 执行命令
        remoteControl.pressButton();
    }
}

以上代码示例中,我们创建了一个遥控器 RemoteControl 对象,通过设置具体的命令对象 LightOnCommandLightOffCommand,来控制电灯 Light 的开关操作。

通过命令模式,使得调用者和接收者解耦,从而实现了灵活的命令执行和扩展。


三、命令模式的应用场景

命令模式的应用场景包括但不限于以下

5

种,请同学们认真学习。

  1. 实现撤销和重做:命令模式可以记录每个操作的命令对象,从而可以方便地实现撤销和重做功能。通过保存命令对象的历史记录,在需要撤销操作时,可以调用命令对象的撤销方法,执行相应的逆操作。
  2. 实现事务操作:当需要将一系列操作作为一个事务来执行时,可以使用命令模式。每个操作都可以封装为一个命令对象,将这些命令对象依次执行,从而实现事务的管理。
  3. 宏命令:宏命令是一种将多个命令封装成一个命令对象的技术。通过将多个命令对象组合起来,可以一次性地执行多个命令,从而实现一系列复杂的操作。
  4. 队列请求:命令模式可以将命令对象存储在队列中,使用一个线程不断地从队列中取出命令对象并执行。这种方式可以实现请求的异步执行和调度。
  5. 菜单和按钮操作:在GUI应用程序中,可以将菜单项和按钮与命令对象关联起来。当用户点击菜单项或按钮时,会执行相应的命令对象,从而实现与用户交互的操作。

总的来说,命令模式适用于需要将请求封装成对象,并希望实现请求的发送者和接收者解耦的场景。它提供了更灵活的方式来管理和执行命令,使得代码更易于维护和扩展。

四、命令模式面试题

  1. 请解释一下什么是命令模式,以及它的优点和适用场景是什么?
  2. 请列举命令模式的角色,并简要描述它们的作用。
  3. 请实现一个简单的命令模式示例,例如通过遥控器控制电灯的开关。
  4. 请解释一下命令模式和策略模式的区别。
  5. 命令模式如何支持撤销操作?请给出一个相关的示例。
  6. 命令模式是否适合用于实现批量操作或事务操作?为什么?
  7. 命令模式是否适用于多线程环境?如果是,需要注意哪些问题?
  8. 命令模式是否可以与其他设计模式结合使用?请举例说明。
  9. 命令模式是否有一种常见的变体或扩展模式?如果有,请介绍一下。
  10. 在实际项目中,你如何应用命令模式来解决问题?请分享一个具体的例子。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。命令模式支持撤销操作,它的核心思想就是将一个请求封装为一个对象,然后通过不同的命令对象来执行请求。
堕落飞鸟
2023/05/04
2810
Head First设计模式——命令模式
前言:命令模式我们平常可能会经常使用,如果我们不了解命令模式的结构和定义那么在使用的时候也不会将它对号入座。
SpringSun
2020/08/11
4480
Head First设计模式——命令模式
设计模式之命令模式(一)
在本次学习过程中,我们把封装带到一个全新的境界:把方法调用(method invocation)封装起来。没错,通过封装方法调用,我们可以把运算块包装成形。
程序员小跃
2019/12/25
6490
重温设计模式 --- 命令模式
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许你将不同的请求对客户端参数化,将请求排队或记录请求日志,以及支持可撤销的操作。
Niuery Diary
2023/10/22
1960
重温设计模式 --- 命令模式
03.如何实现一个遥控器-命令模式
本篇所有示例程序下载: 【设计模式】03.命令模式_博客园jackson0714.zip 命令模式:将请求封装成对象,这可以让你使用不同的请求,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。 在本章,我们将把封装带到一个全新的境界:把方法调用(method invocation) 封装起来。没错,通过封装方法调用,我们可以把运算块包装成形。所以调用此运算的对象不需要关心事情是如何进行的,只要知道如何使
悟空聊架构
2018/05/18
1.1K0
命令模式解读
1) 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作。 2) 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个 App,分别控制,我们希望只要一个 app就可以控制全部智能家电。 3) 要实现一个 app 控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给 app 调用,这时 就可以考虑使用命令模式。 4) 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来. 5) 在我们的例子中,动作的请求者是手机 app,动作的执行者是每个厂商的一个家电产品
一个风轻云淡
2023/10/15
1690
命令模式解读
【设计模式】命令模式
设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。
绿毛龟
2024/01/19
2170
【设计模式】命令模式
设计模式之命令模式
将**请求(一个动作)**封装成对象(命令对象),使得可以用不同的请求对客户进行参数化。
九转成圣
2024/04/10
1590
设计模式之命令模式
浅谈设计模式 - 命令模式(七)
命令模式也是一种比较常见的行为型模式,可以想象我们的手机智能遥控器,通过按动按钮的形式开启各种家具,说白了,就是将一系列的请求命令封装起来,不直接调用真正执行者的方法,这样比较好扩展。需要注意的是命令模式和策略模式相似,所以有时候可能容易弄混,这篇文章将会详细介绍命令模式
阿东
2021/08/16
5060
浅谈设计模式 - 命令模式(七)
命令模式详解
命令模式是一种行为型设计模式,它将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化、对请求排队或记录日志,以及支持可撤销的操作。
码事漫谈
2024/12/20
1710
命令模式详解
设计模式之命令模式(二)
我们通过一个简单的练习,完成了一个控制开关。那现在,我们打算将遥控器的每个插槽,对应到一个命令这样就要遥控器变成“调用者”。当按下按钮,相应命令对象的execute()方法就会被调用,其结果就是,接收者(例如电灯、风扇、音响)的动作被调用。
程序员小跃
2019/12/25
4820
命令模式.
Topic:我们要制作一个简易的遥控器,有两个控制灯开关的按钮,并有一个操作回退按钮。
JMCui
2018/12/19
3010
Java设计模式之命令模式
命令模式是一种行为设计模式,它允许将请求封装成独立的对象,并将其参数化,从而使得可以将请求队列化、记录日志、撤销等操作。命令模式将请求的发送者和接收者解耦,使得它们可以独立变化,从而提高了系统的灵活性和可扩展性。在Java中,命令模式通常涉及命令接口、具体命令类、命令发送者和命令接收者。
刺槐儿
2024/02/02
3010
命令模式
如上述代码所示,我一共写了两种的电器,一种是点灯,一种是电视,小伙伴们在测试的时候完全可以先写一种,然后再去写第二种,体验一下命令模式的可扩展性,并且它是遵循OCP原则的。
@派大星
2023/06/28
1740
命令模式
命令模式,这么学就很简单!
命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。
程序员鱼皮
2023/11/17
1870
命令模式,这么学就很简单!
设计之禅——我只要结果(命令模式)
生活中我们会接收到各种各样的命令,也会发出各种各样的命令,虽然命令的事情都各不相同,但是都具有一个共同的特质,那就是对于发出命令的人而言他不需要知道你是怎么实现的,他只要得到结果就行了,相信大家都会常听到BOSS这样对自己说(当老板真好啊!)。那么,我们在写程序时,如果能将请求的调用和请求的执行解耦,对于客户端而言就不用再关心后台复杂的实现逻辑了,因此,命令模式也就应运而生。
夜勿语
2020/09/07
4270
Python 设计模式-命令模式
观察厂商提供的类,你会发现,好多类提供了 on()、off() 方法,除此之外,还有一些方法像 dim()、setTemperature()、setVolumn()、setDirection()。由此我们可以想象,之后还会有更多的厂商类,每个类还会有各式各样的方法。
goodspeed
2020/12/22
5000
Python 设计模式-命令模式
设计模式之命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志请求等方式来参数化其他对象。命令模式也支持可撤销的操作。
孟斯特
2024/02/04
1550
设计模式之命令模式
Java设计模式之命令模式
智能生活项目需求:我们买了一套智能家电,与照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装一个app就可以控制这些家电工作。
shaoshaossm
2022/12/27
4080
Java设计模式之命令模式
设计模式之命令模式(Command Pattern)
“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是**命令模式(Command Pattern)。 **
desperate633
2018/08/22
3970
相关推荐
设计模式-命令模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档