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

devtools/2025/1/17 21:09:32/

设计模式的分类

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

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

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

什么是命令模式

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

命令模式的组成部分

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

命令模式案例演示

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

VolumeCommand(抽象命令)

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

public interface VolumeCommand {//执行电视机音量调整void execute(String type);}

Television(接收者)

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

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

VolumeCommandImpl(接收者)

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

public class VolumeCommandImpl implements VolumeCommand {private Television television;public VolumeCommandImpl(Television television) {this.television = television;}@Overridepublic void execute(String type) {if ("up".equals(type)) {television.volumeUp();} else {television.volumeDown();}}
}

RemoteControl(接收者)

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

public class RemoteControl {private VolumeCommand volumeCommand;public RemoteControl(VolumeCommand volumeCommand) {this.volumeCommand = volumeCommand;}//调节音量public void adjustVolume(String type){volumeCommand.execute(type);}}

CommandClient(客户端)

客户端演示代码如下:

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");}}

执行结果如下:

电视机音量调大了
电视机音量调小了

结果符合预期。

命令模式的优缺点

优点:

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

缺点:

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

命令模式的使用场景

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

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

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


http://www.ppmy.cn/devtools/151361.html

相关文章

数据结构--二叉树

目录 有序二叉树: 平衡二叉树: 234树: 红黑树 红黑树特点: 为什么红黑树是最优二叉树? 哈夫曼树和哈夫曼编码 有序二叉树: 平衡二叉树: 在有序二叉树的基础上得来的,且左右子…

【2024年华为OD机试】(B卷,100分)- IPv4地址转换成整数 (Java JS PythonC/C++)

一、问题描述 题目描述 存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以 # 号间隔。虚拟IPv4地址可以转换为一个32位的整数。例如: 128#0#255#255,转换为32位整数的结果为 2147549183(0x8000FFF…

图论基础,如何快速上手图论?

目录 引言-对前面数据结构的总结和图论的引导 一.图的基础概念和基本术语 1.1,图的定义 1.2,图的种类 -有向图和无向图以及完全图 1.2.1有向图和无向图 1.2.2完全图和非完全图 1.3,图的基本术语 1.3.1度,路径,环... 1.3.2强连通图和弱连通图 1.3.3权与网 1.3.4连通分量…

《AI与鸿蒙Next:建筑设计可视化的革新力量》

在建筑设计领域,可视化对于呈现设计理念、与客户沟通以及指导施工等环节都至关重要。人工智能与鸿蒙Next图形渲染技术的发展,为建筑设计可视化带来了前所未有的变革与机遇。 人工智能在建筑设计可视化中的作用 快速生成设计方案:人工智能可以…

React 中hooks之useLayoutEffect 用法总结以及与useEffect的区别

React useLayoutEffect 1. useLayoutEffect 基本概念 useLayoutEffect 是 React 的一个 Hook,它的函数签名与 useEffect 完全相同,但它会在所有的 DOM 变更之后同步调用 effect。它可以用来读取 DOM 布局并同步触发重渲染。 2. useLayoutEffect vs us…

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…

微软与腾讯技术交锋,TRELLIS引领3D生成领域多格式支持新方向

去年 11 月&#xff0c;腾讯推出 Hunyuan3D 生成模型&#xff0c;是业界首个同时支持文字和图像生成 3D 的开源大模型。紧接着不到一个月&#xff0c;微软便发布了全新框架 TRELLIS&#xff0c;加入 3D 资产生成领域的竞争中。TRELLIS 支持多格式输出&#xff0c;包括辐射场、3…

ubuntu22.04:解决google chrome 访问百度页面加载慢的问题

前因&#xff1a;ubuntu22.04系统&#xff0c;本地有两个浏览器&#xff0c;firefox和chrome&#xff0c;firefox无论是使用代理还是不使用代理访问百度网站的速度都十分的快&#xff0c;chrome即使开代理访问百度网站也很慢&#xff0c;但是访问其他网站却很快。 1、在chrome地…