通俗易懂设计模式(命令模式)

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使得请求可以被传递、存储、撤销和重做。命令模式的主要目的是将请求的发送者和接收者解耦,让多个请求的发送者可以通过相同的接口来发送请求,而不需要知道请求的具体实现。

命令模式的主要组成部分包括:

  1. 命令(Command):定义了一个接口,用于执行请求。命令可以是一个抽象类或者一个接口。
  2. 具体命令(ConcreteCommand):实现了命令接口,并在其中定义了一个指向接收者的引用。具体命令负责将请求传递给接收者,并调用接收者的方法来执行请求。
  3. 接收者(Receiver):负责实际执行请求的对象。接收者可以是任何类,只要它能够实现请求的功能。
  4. 请求者(Invoker):负责发送请求的对象。请求者可以是任何类,只要它能够调用命令的 execute() 方法来发送请求。
  5. 客户端(Client):负责创建命令对象、接收者对象和请求者对象,并将它们组合在一起。客户端可以是任何类,只要它能够创建和组合这些对象。

Java 实现命令模式的示例代码:

java 复制代码
// 命令接口
public interface Command {
    void execute();
    void undo();
}

// 具体命令类
public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.undoAction();
    }
}

// 接收者类
public class Receiver {
    public void action() {
        System.out.println("Receiver: perform action");
    }

    public void undoAction() {
        System.out.println("Receiver: undo action");
    }
}

// 请求者类
public class Invoker {
    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }

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

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

    public void undoCommand() {
        command.undo();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);

        invoker.executeCommand();
        invoker.undoCommand();
    }
}

在这个示例中,我们定义了一个命令接口 Command,它包含了 execute()undo() 方法。接着,我们定义了一个具体命令类 ConcreteCommand,它实现了 Command 接口,并在其中定义了一个指向接收者的引用。在具体命令类的 execute()undo() 方法中,我们调用了接收者的相应方法来执行请求。

接着,我们定义了一个接收者类 Receiver,它负责实际执行请求的功能。然后,我们定义了一个请求者类 Invoker,它负责发送请求的对象。在请求者类的 executeCommand()undoCommand() 方法中,我们调用了命令的相应方法来发送请求。

在客户端代码中,我们创建了一个接收者对象、一个命令对象和一个请求者对象,并将它们组合在一起。然后,我们通过请求者对象来发送请求。通过这种方式,我们将请求的发送者和接收者解耦,让多个请求的发送者可以通过相同的接口来发送请求,而不需要知道请求的具体实现。这样,我们就将请求的发送和执行过程封装在了命令类和接收者类中,使得请求的发送和执行变得更加灵活和可扩展。

相关推荐
晚安里5 分钟前
Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总
java·spring boot·spring
爱隐身的官人16 分钟前
新后端漏洞(上)- Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)
java·tomcat·ajp
@CLoudbays_Martin1128 分钟前
为什么动态视频业务内容不可以被CDN静态缓存?
java·运维·服务器·javascript·网络·python·php
四谎真好看41 分钟前
Java 学习笔记(进阶篇2)
java·笔记·学习
上官浩仁1 小时前
springboot ioc 控制反转入门与实战
java·spring boot·spring
叫我阿柒啊1 小时前
从Java全栈到前端框架:一位程序员的实战之路
java·spring boot·微服务·消息队列·vue3·前端开发·后端开发
mqiqe2 小时前
架构-亿级流量性能调优实践
java·架构
野犬寒鸦2 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
七夜zippoe2 小时前
AI+Java 守护你的钱袋子!金融领域的智能风控与极速交易
java·人工智能·金融
岁忧3 小时前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先