设计模式--命令模式【行为型模式】

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式系列文章传送门

设计模式的 7 大原则

设计模式--单例模式【创建型模式】

设计模式--工厂方法模式【创建型模式】

设计模式--抽象工厂模式【创建型模式】

设计模式--建造者模式【创建型模式】

设计模式--原型模式【创建型模式】

设计模式--适配器模式【结构型模式】

设计模式--装饰器模式【结构型模式】

设计模式--代理模式【结构型模式】

设计模式--外观模式(门面模式)【结构型模式】

设计模式--桥接模式【结构型模式】

设计模式--组合模式【结构型模式】

设计模式--享元模式【结构型模式】

设计模式--策略模式【行为型模式】

设计模式--模板方法模式【行为型模式】

设计模式--观察者模式【行为型模式】

设计模式--迭代器模式【行为型模式】

设计模式--责任链模式【行为型模式】

什么是命令模式

命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,实现请求的发送者和接受者之间的解耦,本质就是封装请求。

命令模式的组成部分

  • 抽象命令:定义了执行操作的接口,具体的命令类会实现这个接口,并提供执行相应操作的具体逻辑。
  • 具体命令:实现了抽象命令接口,它持有一个接受者对象,并调用接收者的方法来完成需要执行的功能。
  • 调用者:负责调用命令对象执行请求,它持有一个命令对象,命令对象会调用接收者的方法来执行请求。
  • 接收者:持有一个或者多个命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

命令模式案例演示

命令模式其实在我们生活中有很多案例的,例如开关电视、开关空调、遥控机器人等等都是命令模式的场景,我们以电视机的音量调节作为命令模式的案例演示,音量调大或者调小各是一个命令。

VolumeCommand(抽象命令)

VolumeCommand 定义了电视机音量调整的接口,具体代码如下:

java 复制代码
public interface VolumeCommand {

    //执行电视机音量调整
   void execute(String type);

}

Television(接收者)

Television 电视机作为接收者,提供了音量调大和调小的接口,具体代码如下:

java 复制代码
public class Television {

    //音量调大
    public void volumeUp() {
        System.out.println("电视机音量调大了");
    }

    //音量调小
    public void volumeDown(){
        System.out.println("电视机音量调小了");
    }
}

VolumeCommandImpl(接收者)

VolumeCommandImpl 电视机声音调整的具体命令,重写了命令执行的接口,并持有一个命令接受者电视机对象,并根据调整类型选择调大还是调小音量,提供了音量调大和调小的接口,具体代码如下:

java 复制代码
public class VolumeCommandImpl implements VolumeCommand {

    private Television television;

    public VolumeCommandImpl(Television television) {
        this.television = television;
    }

    @Override
    public void execute(String type) {
        if ("up".equals(type)) {
            television.volumeUp();
        } else {
            television.volumeDown();
        }

    }
}

RemoteControl(接收者)

RemoteControl 遥控器类,持有一个命令对象,根据用户输入的命令类型,使用命令对象执行命令,具体代码如下:

java 复制代码
public class RemoteControl {

    private VolumeCommand volumeCommand;

    public RemoteControl(VolumeCommand volumeCommand) {
        this.volumeCommand = volumeCommand;
    }

    //调节音量
    public void adjustVolume(String type){
        volumeCommand.execute(type);
    }

}

CommandClient(客户端)

客户端演示代码如下:

java 复制代码
public class CommandClient {

    public static void main(String[] args) {
        //命令接受者 电视机
        Television television = new Television();
        //具体命令
        VolumeCommand volumeCommand = new VolumeCommandImpl(television);
        //命令调用者
        RemoteControl remoteControl = new RemoteControl(volumeCommand);
        //发起音量调大命令
        remoteControl.adjustVolume("up");
        //发起音量调小命令
        remoteControl.adjustVolume("down");

    }

}

执行结果如下:

powershell 复制代码
电视机音量调大了
电视机音量调小了

结果符合预期。

命令模式的优缺点

优点:

  • 解耦了调用者和接受者,调用者不需要知道接收者的具体实现细节,只需要调用命令对象的 execute()方法即可,这样就算改变接收者的实现或者添加新的接收者,都不会影响调用者,也体现了良好的扩展性。
  • 由于每个命令对象都封装了具体的操作,可以很容易地实现命令的撤销和重做功能。
  • 命令对象可以被组织成队列或堆栈,实现对操作的排队和延迟执行。

缺点:

  • 增加了系统的复杂性,使用命令模式会增加一些类,会导致代码结构变的更复杂。
  • 由于命令的执行通常需要经过多层调用,调用者 -> 命令 -> 接收者,在一些对性能要求极高的场景下,可能会产生一定的性能开销。

命令模式的使用场景

  • Runnable 接口就是命令模式的典型应用场景,Runnable接口封装了需要执行的任务,然后可以交给线程去执行。
  • 当需要对请求进行参数化,使得可以在不同的请求之间进行切换和组合时,可以选择使用命令模式。
  • 当需要将请求操作的调用者和接收者解耦时,可以选择使用命令模式。

总结:本篇简单分享了命令模式的概念和使用方式,并用电视机音量调整作为业务场景,进行了命令模式的案例演示,命令模式还是比较好理解的,也是一种十分实用的设计模式,希望我的分享可以帮助到不太熟悉命令模式的朋友们。

如有不正确的地方欢迎各位指出纠正。

相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵2 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw4 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4045 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空5 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643146 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0016 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤6 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式