• 设计模式:命令模式


    命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户端进行参数化。这样可以将请求的发送者和接收者解耦,使得发送者不需要知道具体的接收者,而是通过命令对象来间接地调用接收者的方法。

    组件

    在命令模式中,通常包含以下角色:

    1. 命令接口(Command Interface):定义了执行命令的方法,可以是抽象类或接口。
    2. 具体命令类(Concrete Command):实现了命令接口,并持有对接收者的引用。具体命令类封装了具体的请求和接收者的方法调用。
    3. 接收者类(Receiver):执行命令所关联的操作,具体命令类通过调用接收者的方法来实现命令的执行。
    4. 调用者类(Invoker):负责调用命令对象来执行请求。它持有命令对象的引用,并在需要时调用命令对象的方法。
      命令模式将请求封装成对象,使得可以对请求进行参数化、队列化、记录日志等操作。它可以实现请求的撤销和重做,以及实现命令的延迟执行。命令模式常用于实现菜单、按钮、撤销操作等功能。

    代码示例

    interface Command {
        void execute();
    }
     // 具体命令类
    class ConcreteCommand implements Command {
        private Receiver receiver;
         public ConcreteCommand(Receiver receiver) {
            this.receiver = receiver;
        }
         public void execute() {
            receiver.action();
        }
    }
     // 接收者类
    class Receiver {
        public void action() {
            System.out.println("接收者执行操作");
        }
    }
     // 调用者类
    class Invoker {
        private Command command;
         public void setCommand(Command command) {
            this.command = command;
        }
         public void executeCommand() {
            command.execute();
        }
    }
     // 客户端代码
    public class Main {
        public static void main(String[] args) {
            Receiver receiver = new Receiver();
            Command command = new ConcreteCommand(receiver);
             Invoker invoker = new Invoker();
            invoker.setCommand(command);
            invoker.executeCommand();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在上述示例中,我们定义了一个命令接口(Command),具体命令类(ConcreteCommand)实现了该接口,并持有对接收者(Receiver)的引用。接收者类负责执行具体的操作。调用者类(Invoker)持有命令对象的引用,并通过调用命令对象的 execute() 方法来执行请求。

    客户端代码中,我们创建了接收者对象、具体命令对象和调用者对象。然后,将具体命令对象设置到调用者对象中,并调用调用者对象的 executeCommand() 方法来执行命令。

    这个示例展示了如何使用Java实现命令模式,通过封装请求成命令对象,实现了请求的发送者和接收者解耦。

    源码中使用

    在源码中,命令模式有很多应用。以下是一些常见的源码中使用命令模式的情况:

    1. Java AWT和Swing框架:在图形用户界面(GUI)开发中,命令模式被广泛应用。例如,按钮(Button)组件使用命令模式来处理点击事件。每个按钮都有一个与之关联的命令对象,当按钮被点击时,命令对象的 execute() 方法被调用。
    2. 线程池(ThreadPoolExecutor):线程池中的任务(Runnable)对象可以被看作是命令对象,线程池作为调用者(Invoker),负责执行任务。
    3. 操作系统中的命令行工具:在操作系统中,命令行工具通常使用命令模式来处理不同的命令。每个命令都有一个相应的命令对象,当用户输入命令时,命令对象的 execute() 方法被调用。
    4. 撤销和重做功能:命令模式可以用于实现撤销和重做功能。每个操作被封装成一个命令对象,可以将命令对象存储在历史记录中,当需要撤销或重做时,调用相应的命令对象的 execute() 或 undo() 方法。
      这些是命令模式在源码中的一些常见应用。命令模式通过将请求封装成对象,实现了请求的发送者和接收者的解耦,提供了更灵活和可扩展的架构。

    优缺点

    优点:

    1. 解耦请求发送者和接收者:命令模式将请求封装成一个独立的对象,使得发送者和接收者之间解耦。发送者无需知道接收者的具体实现,只需要通过命令对象来发送请求。
    2. 容易扩展和维护:由于命令模式将请求封装成对象,因此可以方便地添加新的命令和接收者,而无需修改现有的代码。这使得系统更加灵活和可扩展,并且便于维护。
    3. 支持撤销和重做操作:命令模式可以记录请求的历史,从而支持撤销和重做操作。通过保存命令对象的执行历史,可以在需要时逆向执行命令,实现撤销和重做功能。
    4. 支持组合命令:命令模式可以将多个命令组合成一个复合命令,从而实现更复杂的操作。这种组合可以通过组合模式来实现,使得系统更加灵活和可扩展。
      缺点:
    5. 增加了类的数量:命令模式引入了额外的命令类、接收者类和调用者类,增加了系统的复杂性和类的数量。
    6. 可能导致系统过于细粒度:在某些情况下,命令模式可能会导致系统中出现大量的具体命令类,从而使得系统过于细粒度,不利于管理和维护。

    总结

    命令模式通过将请求封装成对象,实现了请求发送者和接收者的解耦,提供了更灵活、可扩展和可维护的架构。它支持撤销和重做操作,并且可以组合多个命令来实现复杂的操作。然而,命令模式也会增加类的数量,并可能导致系统过于细粒度。因此,在使用命令模式时需要权衡其优缺点,确保合理使用。

  • 相关阅读:
    现在的00后,真是卷死了呀,辞职信已经写好了·····
    C#中隐藏窗体并执行窗体逻辑的方法
    1055 The World‘s Richest
    因为ViewPager与SwipeRefreshLayout冲突导致RecyclerView或者其他列表布局的item无法点击的问题
    网站整站优化-网站整站优化工具
    【LeetCode周赛】LeetCode第365场周赛
    【Leetcode】210.课程表II
    python分支结构的花样玩法(二)
    gcc 新旧版本ldd的显示动态库的不同
    B. Codeforces Subsequences
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945724