首页 > 其他分享 >初识设计模式 - 命令模式

初识设计模式 - 命令模式

时间:2022-10-21 08:55:49浏览次数:47  
标签:请求 void 接收者 模式 命令 初识 command 设计模式 public

简介

命令设计模式(Command Design Pattern)可以将请求发送者和接收者完全解耦。发送者和接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

其定义是,将请求(命令)封装成一个对象,从而可用不同的请求对客户进行参数化(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。

典型实现

首先,定义一个抽象命令 Command 接口,通常仅声明一个执行命令的方法,其代码示例如下:

public interface Command {
    // 业务处理方法
    void execute();
}

具体命令会实现各种类型的请求,其自身并不完成工作,而是将调用委派给一个业务逻辑对象,其代码示例如下:

public class ConcreteCommand implements Command {
    // 维持一个对请求者对象的引用
    private final Receiver receiver;

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

    // 调用请求接收者的业务处理方法
    public void execute() {
        this.receiver.action();
    }
}

接收者是真正命令执行的对象,是客户端直接操作的对象,其代码示例如下:

public class Receiver {
    public void action() {
        // 具体操作
    }
}

最后,需要定义的是调用者 Invoker 类,其作用是负责对请求进行初始化,其代码示例如下:

public class Invoker {
    private final List<Command> commandList;

    public Invoker() {
        this.commandList = new ArrayList<>();
    }

    public Invoker(Command command) {
        this();
        this.commandList.add(command);
    }

    // 添加命令
    public void pushCommand(Command command) {
        this.commandList.add(command);
    }

    // 执行命令
    public void executeAll() {
        for (Command command : commandList) {
            command.execute();
        }
        commandList.clear();
    }
}

对于客户端而言,需要知道自己需要操作的接收者对象是什么、可以执行的命令有哪些、通过调用者如何去执行这些命令。

如下是客户端使用命令模式的代码示例:

public class CommandDemo {
    public static void main(String[] args) {
        // 操作的接收者对象是什么
        Receiver receiver = new Receiver();

        // 可以执行的命令有哪些
        Command command = new ConcreteCommand(receiver);

        // 通过调用者如何去执行这些命令
        Invoker invoker = new Invoker(command);
        invoker.executeAll();
    }
}

总结

优点

命令模式的主要优点如下:

  • 降低请求者和接收者的耦合度
  • 新的命令可以很方便地加入到系统中
  • 可以比较容易地设计一个命令队列或者宏命令(组合命令)
  • 为请求的撤销和恢复操作提供了一种设计和实现方案

缺点

命令模式的主要缺点如下:

  • 可能会导致系统中有过多的具体命令类

适用场景

命令模式的适用场景如下:

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
  • 系统需要在不同的时间指定请求、将请求排队和执行请求
  • 系统需要支持命令的撤销操作和恢复操作
  • 系统需要将一组操作组合在一起形成宏命令

源码

在 JDK 中,Runnable 接口就类似于命令模式的命令接口。

只要实现了 Runnable 接口的类都被认为是一个线程类,相当于命令模式中具体命令类的角色。而实现了 Runnable 接口的 Thread 类既可以作为具体命令类,也可以作为调用者。

如下是客户端使用 RunnableThread 的代码示例:

public class ThreadDemo {
    public static void main(String[] args) {
        Runnable command = new Runnable() {
            @Override
            public void run() {
                System.out.println("command 线程执行");
            }
        };

        Thread thread = new Thread(command);
        // command 线程执行
        thread.start();
    }
}

标签:请求,void,接收者,模式,命令,初识,command,设计模式,public
From: https://www.cnblogs.com/fatedeity/p/16812261.html

相关文章

  • 初识字符串
    社么是字符串由双引号括起来的一串字符叫做字符串字符串的标志是由\0以结束标语的,以\0为结束标志,字符串长度不变  没有引用头文件     字符串结束标志......
  • C语言多路开关模式的switch语句
    C语言多路开关模式的switch语句将switch语句中有的语句块的break删除掉。使多个语句块输出同一个。例子:输入一个月份,判断是几月份。#define_CRT_SECURE_NO_WARNINGS1#incl......
  • 创建型模式~原型模式
    preknowledge:1值类型&引用类型~内存四区值类型:intfloatdouble引用类型:string实例对象内存四区:OP将内存划分为四个区域:代码段,全局变量区,栈,堆~不同......
  • 生产者消费者模式
    生产者消费者模式(Java实现)定义在⼀个⽣产环境中,⽣产者和消费者在同⼀时间段内共享同⼀块缓冲区,⽣产者负责向缓冲区添加数据,消费者负责从缓冲区取出数据使用资源类......
  • 单例模式在 Runtime 类中的应用
    JDK中java.lang.Runtime类是一个单例类每个Java应用在运行时会启动一个JVM进程,每个JVM进程都只对应一个Runtime实例,用于查看JVM状态以及控制JVM行为。进程......
  • 观察者模式在 JDK 中的应用
    GoogleGuava的EventBus框架,它提供了观察者模式的骨架代码。使用EventBus,不需要从零开始开发观察者模式。实际上,JavaJDK也提供了观察者模式的简单框架实现。在平时的......
  • 设计模式之单例模式
    简介在实际开发中,为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实......
  • Windows活动目录_初识
    计算机组织形式工作组(用户本地登录时构造SID进行权限分配);域(统一身份验证与管理)域注意事项实体:域控、域用户、加入域的机子。  依赖的服务:netlogon服务强制刷新组策......
  • Tutorial 6_原型模式
    向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。浅克隆  深克隆  ......
  • Tutorial 7_单例模式
    学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。类图  代码  2.1StudentID.javapackagedanli;publicclassStudentID{......