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

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



一、什么是命令模式

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

在命令模式中,主要包含以下 5 55 个角色。

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

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


二、命令模式实例

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

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

public interface Command {
    void execute();
}

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

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,其中包含了具体的开关操作,代码如下。

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

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

public class RemoteControl {
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    }
    public void pressButton() {
        command.execute();
    }
}

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

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 55 种,请同学们认真学习。

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

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


四、命令模式面试题

  1. 请解释一下什么是命令模式,以及它的优点和适用场景是什么?
  2. 请列举命令模式的角色,并简要描述它们的作用。
  3. 请实现一个简单的命令模式示例,例如通过遥控器控制电灯的开关。
  4. 请解释一下命令模式和策略模式的区别。
  5. 命令模式如何支持撤销操作?请给出一个相关的示例。
  6. 命令模式是否适合用于实现批量操作或事务操作?为什么?
  7. 命令模式是否适用于多线程环境?如果是,需要注意哪些问题?
  8. 命令模式是否可以与其他设计模式结合使用?请举例说明。
  9. 命令模式是否有一种常见的变体或扩展模式?如果有,请介绍一下。
  10. 在实际项目中,你如何应用命令模式来解决问题?请分享一个具体的例子。
相关文章
|
11月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2790 35
|
11月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
745 8
|
11月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1153 157
|
11月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
1044 2
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
306 0
Java 识别请求来自移动端还是电脑端
Java 识别请求来自移动端还是电脑端
582 0
Java 识别请求来自移动端还是电脑端
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
534 1