当前位置: 首页 > news >正文

设计模式之命令模式(下)

2)完整解决方案
1.结构图

在这里插入图片描述

FBSettingWindow是“功能键设置”界面类,FunctionButton充当请求调用者,Command充当抽象命令类,MinimizeCommand和HelpCommand充当具体命令类,WindowHanlder和HelpHandler充当请求接收者。

2.代码实现
import lombok.Data;
import java.util.*;//功能键设置窗口类
@Data
public class FBSettingWindow {//窗口标题private String title;//定义一个ArrayList来存储所有功能键private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();public FBSettingWindow(String title) {this.title = title;}public void addFunctionButton(FunctionButton fb) {functionButtons.add(fb);}public void removeFunctionButton(FunctionButton fb) {functionButtons.remove(fb);}//显示窗口及功能键public void display() {System.out.println("显示窗口:" + this.title);System.out.println("显示功能键:");for (Object obj : functionButtons) {System.out.println(((FunctionButton)obj).getName());}System.out.println("------------------------------");}
}import lombok.Data;//功能键类:请求发送者
@Data
class FunctionButton {//功能键名称private String name;//维持一个抽象命令对象的引用private Command command;public FunctionButton(String name) {this.name = name;}//发送请求的方法public void onClick() {System.out.print("点击功能键:");command.execute();}
}//抽象命令类
abstract class Command {public abstract void execute();
}//帮助命令类:具体命令类
public class HelpCommand extends Command {//维持对请求接收者的引用private HelpHandler hhObj;public HelpCommand() {hhObj = new HelpHandler();}//命令执行方法,将调用请求接收者的业务方法public void execute() {hhObj.display();}
}//最小化命令类:具体命令类
public class MinimizeCommand extends Command {//维持对请求接收者的引用private WindowHanlder whObj;public MinimizeCommand() {whObj = new WindowHanlder();}//命令执行方法,将调用请求接收者的业务方法public void execute() {whObj.minimize();}
}//帮助文档处理类:请求接收者
public class HelpHandler {public void display() {System.out.println("显示帮助文档!");}
}//窗口处理类:请求接收者
public class WindowHanlder {public void minimize() {System.out.println("将窗口最小化至托盘!");}
}public class Client {public static void main(String args[]) {FBSettingWindow fbsw = new FBSettingWindow("功能键设置");FunctionButton fb1,fb2;fb1 = new FunctionButton("功能键1");fb2 = new FunctionButton("功能键2");Command command1,command2;command1 = new HelpCommand();command2 = new MinimizeCommand();//将命令对象注入功能键fb1.setCommand(command1);fb2.setCommand(command2);fbsw.addFunctionButton(fb1);fbsw.addFunctionButton(fb2);fbsw.display();//调用功能键的业务方法fb1.onClick();fb2.onClick();}
}

注意

每一个具体命令类对应一个请求的处理者(接收者),通过向请求发送者注入不同的具体命令对象可以使得相同的发送者对应不同的接收者,从而实现“将一个请求封装为一个对象,用不同的请求对客户进行参数化”。

3)命令队列的实现
1.概述

将多个请求排队,当一个请求发送者发送一个请求时,将不止一个请求接收者产生响应,这些请求接收者将逐个执行业务方法,完成对请求的处理。

2.方案

增加一个CommandQueue类,由该类负责存储多个命令对象,而不同的命令对象可以对应不同的请求接收者。

3.代码实现

命令队列类

import java.util.*;public class CommandQueue {//定义一个ArrayList来存储命令队列private ArrayList<Command> commands = new ArrayList<Command>();public void addCommand(Command command) {commands.add(command);}public void removeCommand(Command command) {commands.remove(command);}//循环调用每一个命令对象的execute()方法public void execute() {for (Object command : commands) {((Command)command).execute();}}
}

请求发送者类Invoker将针对CommandQueue编程

public class Invoker {//维持一个CommandQueue对象的引用private CommandQueue commandQueue; //构造注入public Invoker(CommandQueue commandQueue) {this. commandQueue = commandQueue;}//设值注入public void setCommandQueue(CommandQueue commandQueue) {this.commandQueue = commandQueue;}//调用CommandQueue类的execute()方法public void call() {commandQueue.execute();}
}

客户端类

import com.xu.model.command.demo02.Invoker;public class Client02 {public static void main(String args[]) {CommandQueue commandQueue = new CommandQueue();Command command1,command2;command1 = new HelpCommand();command2 = new MinimizeCommand();commandQueue.addCommand(command1);commandQueue.addCommand(command2);Invoker invoker = new Invoker(commandQueue);invoker.call();}
}

命令队列可以对一组对象(命令)进行批量处理,当一个发送者发送请求后,将有一系列接收者对请求作出响应,如果请求接收者的接收次序没有严格的先后次序,还可以使用多线程技术来并发调用命令对象的execute()方法,从而提高程序的执行效率。

4)撤销操作的实现
1.方案

通过在命令类中增加一个逆向操作(Undo)来实现。

通过保存对象的历史状态来实现,可以使用备忘录模式(Memento Pattern)。

2.结构图

在这里插入图片描述

CalculatorForm充当请求发送者,实现了数据求和功能的加法类Adder充当请求接收者,界面类可间接调用加法类中的add()方法实现加法运算,并且提供了可撤销加法运算的undo()方法。

3.代码实现
//抽象命令类
abstract class AbstractCommand {//声明命令执行方法execute()public abstract int execute(int value);//声明撤销方法undo()public abstract int undo();
}//具体命令类
public class ConcreteCommand extends AbstractCommand {private Adder adder = new Adder();private int value;//实现抽象命令类中声明的execute()方法,调用加法类的加法操作public int execute(int value) {this.value=value;return adder.add(value);}//实现抽象命令类中声明的undo()方法,通过加一个相反数来实现加法的逆向操作public int undo() {return adder.add(-value);}
}//计算器界面类:请求发送者
public class CalculatorForm {private AbstractCommand command;public void setCommand(AbstractCommand command) {this.command = command;}//调用命令对象的execute()方法执行运算public void compute(int value) {int i = command.execute(value);System.out.println("执行运算,运算结果为:" + i);}//调用命令对象的undo()方法执行撤销public void undo() {int i = command.undo();System.out.println("执行撤销,运算结果为:" + i);}
}//加法类:请求接收者
public class Adder {//定义初始值为0private int num = 0;//加法操作,每次将传入的值与num作加法运算,再将结果返回public int add(int value) {num += value;return num;}
}public class Client {public static void main(String[] args) {CalculatorForm form = new CalculatorForm();AbstractCommand command;command = new ConcreteCommand();form.setCommand(command); //向发送者注入命令对象form.compute(10);form.compute(5);form.compute(10);form.undo();}
}

注意:本实例中只能实现一步撤销操作,因为没有保存命令对象的历史状态,可以通过引入一个命令集合来存储每一次操作时命令的状态,从而实现多次撤销操作,除了Undo操作外,还可以采用类似的方式实现恢复(Redo)操作,即恢复所撤销的操作。

5)请求日志
1.概述

请求日志是将请求的历史记录保存下来,通常以日志文件(Log File)的形式存储在磁盘中。

2.适用场景
  • 一旦系统发生故障,日志文件可以为系统提供一种恢复机制,在请求日志文件中可以记录用户对系统的每一步操作,从而让系统能够顺利恢复到某一个特定的状态。
  • 请求日志也可以用于实现批处理,在一个请求日志文件中可以存储一系列命令对象,例如一个命令队列。
  • 可以将命令队列中的所有命令对象都存储在一个日志文件中,每执行一个命令则从日志文件中删除一个对应的命令对象,防止因为断电或者系统重启等原因造成请求丢失,而且可以避免重新发送全部请求时造成某些命令的重复执行,只需读取请求日志文件,再继续执行文件中剩余的命令即可。
3.结构图

在这里插入图片描述

4.代码实现
import lombok.Data;
import java.io.*;//抽象命令类,由于需要将命令对象写入文件,因此它实现了Serializable接口
@Data
abstract class Command implements Serializable {//命令名称protected String name;//命令参数protected String args;//维持对接收者对象的引用protected ConfigOperator configOperator;public Command(String name) {this.name = name;}public void setConfigOperator(ConfigOperator configOperator) {this.configOperator = configOperator;}//声明两个抽象的执行方法execute()public abstract void execute(String args);public abstract void execute();
}//增加命令类:具体命令
public class InsertCommand extends Command {public InsertCommand(String name) {super(name);}public void execute(String args) {this.args = args;configOperator.insert(args);}public void execute() {configOperator.insert(this.args);}
}//修改命令类:具体命令
public class ModifyCommand extends Command {public ModifyCommand(String name) {super(name);}public void execute(String args) {this.args = args;configOperator.modify(args);}public void execute() {configOperator.modify(this.args);}
}import lombok.Setter;
import java.util.ArrayList;//配置文件设置窗口类:请求发送者
@Setter
public class ConfigSettingWindow {//定义一个集合来存储每一次操作时的命令对象private ArrayList<Command> commands = new ArrayList<Command>();private Command command;//执行配置文件修改命令,同时将命令对象添加到命令集合中public void call(String args) {command.execute(args);commands.add(command);}//记录请求日志,生成日志文件,将命令集合写入日志文件public void save() {FileUtil.writeCommands(commands);}//从日志文件中提取命令集合,并循环调用每一个命令对象的execute()方法来实现配置文件的重新设置public void recover() {ArrayList list;list = FileUtil.readCommands();for (Object obj : list) {((Command) obj).execute();}}
}import java.io.Serializable;//配置文件操作类:请求接收者。
//由于ConfigOperator类的对象是Command的成员对象,它也将随Command对象一起写入文件,因此ConfigOperator也需要实现Serializable接口
class ConfigOperator implements Serializable {public void insert(String args) {System.out.println("增加新节点:" + args);}public void modify(String args) {System.out.println("修改节点:" + args);}public void delete(String args) {System.out.println("删除节点:" + args);}
}import java.io.*;
import java.util.ArrayList;//工具类:文件操作类
public class FileUtil {//将命令集合写入日志文件public static void writeCommands(ArrayList commands) {try {FileOutputStream file = new FileOutputStream("/Users/hhx/Desktop/config.log");//创建对象输出流用于将对象写入到文件中ObjectOutputStream objout = new ObjectOutputStream(new BufferedOutputStream(file));//将对象写入文件objout.writeObject(commands);objout.close();} catch (Exception e) {System.out.println("命令保存失败!");e.printStackTrace();}}//从日志文件中提取命令集合public static ArrayList readCommands() {try {FileInputStream file = new FileInputStream("/Users/hhx/Desktop/config.log");//创建对象输入流用于从文件中读取对象ObjectInputStream objin = new ObjectInputStream(new BufferedInputStream(file));//将文件中的对象读出并转换为ArrayList类型ArrayList commands = (ArrayList) objin.readObject();objin.close();return commands;} catch (Exception e) {System.out.println("命令读取失败!");e.printStackTrace();return null;}}
}public class Client {public static void main(String[] args) {//定义请求发送者ConfigSettingWindow csw = new ConfigSettingWindow();//定义命令对象Command command;//定义请求接收者ConfigOperator co = new ConfigOperator();//四次对配置文件的更改command = new InsertCommand("增加");command.setConfigOperator(co);csw.setCommand(command);csw.call("网站首页");command = new InsertCommand("增加");command.setConfigOperator(co);csw.setCommand(command);csw.call("端口号");command = new ModifyCommand("修改");command.setConfigOperator(co);csw.setCommand(command);csw.call("网站首页");command = new ModifyCommand("修改");command.setConfigOperator(co);csw.setCommand(command);csw.call("端口号");System.out.println("----------------------------");System.out.println("保存配置");csw.save();System.out.println("----------------------------");System.out.println("恢复配置");System.out.println("----------------------------");csw.recover();}
}
6)宏命令
1.概述

宏命令(Macro Command)又称为组合命令,它是组合模式和命令模式联用的产物。

宏命令是一个具体命令类,它拥有一个集合属性,在该集合中包含了对其他命令对象的引用。

2.原理

通常宏命令不直接与请求接收者交互,而是通过它的成员来调用接收者的方法,当调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,一个宏命令的成员可以是简单命令,还可以继续是宏命令。

执行一个宏命令将触发多个具体命令的执行,从而实现对命令的批处理。

3.结构图

在这里插入图片描述

7)总结
1.优点
  • 由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦。

  • 由于增加新的具体命令类不会影响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码,甚至客户类代码。

  • 可以比较容易地设计一个命令队列或宏命令(组合命令)。

  • 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。

2.缺点
  • 使用命令模式可能会导致系统有过多的具体命令类。
3.适用场景
  • 系统需要将请求调用者和请求接收者解耦。

  • 系统需要在不同的时间指定请求、将请求排队和执行请求,一个命令对象和请求的初始调用者可以有不同的生命期,可以通过该命令对象去调用请求接收者,可以通过请求日志文件等机制来实现。

  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

  • 系统需要将一组操作组合在一起形成宏命令。

相关文章:

设计模式之命令模式(下)

2&#xff09;完整解决方案 1.结构图 FBSettingWindow是“功能键设置”界面类&#xff0c;FunctionButton充当请求调用者&#xff0c;Command充当抽象命令类&#xff0c;MinimizeCommand和HelpCommand充当具体命令类&#xff0c;WindowHanlder和HelpHandler充当请求接收者。 …...

【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...

#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具库的头文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理的头文件 #include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码的头文件 #include "opencv2/highgui…...

计算机网络---第三天

OSI参考模型与TCP/IP模型 参考模型产生背景&#xff1a; 背景&#xff1a;①兼容性较差&#xff0c;接口不统一 ②不利于排错与维护 ③设备成本高 参考模型概念&#xff1a; 概念&#xff1a;OSI参考模型定义了网络中设备所遵守的层次结构 参考模型优点&#xff1a; 优点…...

怎么防止文件被拷贝,复制别人拷贝电脑文件

怎么防止文件被拷贝&#xff0c;复制别人拷贝电,脑文件 防止文件被拷贝通常是为了保护敏感数据、知识产权或商业秘密不被未经授权的人员获取或传播。以下列出了一系列技术手段和策略&#xff0c;可以帮助您有效地防止文件被拷贝。 1. 终端管理软件&#xff1a; 如安企神、域智…...

流式密集视频字幕

流式密集视频字幕 摘要1 IntroductionRelated Work3 Streaming Dense Video Captioning Streaming Dense Video Captioning 摘要 对于一个密集视频字幕生成模型&#xff0c;预测在视频中时间上定位的字幕&#xff0c;理想情况下应该能够处理长的输入视频&#xff0c;预测丰富、…...

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …...

新型基础设施建设(新基建)

新型基础设施建设&#xff08;新基建&#xff09;主要包括七个方面&#xff0c;即5G基站建设、特高压、城际高速铁路和城市轨道交通、新能源汽车充电桩、大数据中心、人工智能和工业互联网。 以下是新型基础设施的详细内容&#xff1a; 一、5G基站建设。5G网络的扩展和优化&a…...

蓝桥杯 第 9 场 小白入门赛 字符迁移

题目&#xff1a; 3.字符迁移【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 此题通过把小写字母映射成数字&#xff0c;进行差分即可。 AC代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm>using namespace std;typed…...

泰迪智能科技人工智能应用工程师(中级)特训营

随着人工智能技术的迅猛发展和应用的不断拓展&#xff0c;掌握人工智能技术已成为现代职业发展和企业创新的关键。为此&#xff0c;人工智能技能提升特训营应运而生&#xff0c;以全面、系统的课程设置&#xff0c;帮助学员深入掌握相关的理论知识&#xff0c;实践操作技能。特…...

【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…...

java的基本数据类型

在Java编程语言中&#xff0c;基本数据类型是构成Java程序的基础元素&#xff0c;它们用于存储简单值。Java的基本数据类型可以分为两大类&#xff1a;原始类型&#xff08;Primitive Types&#xff09;和引用类型&#xff08;Reference Types&#xff09;。原始类型包括整型、…...

0104练习与思考题-算法基础-算法导论第三版

2.3-1 归并示意图 问题&#xff1a;使用图2-4作为模型&#xff0c;说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示&#xff1a; tips:&#xff1a;有不少在线算法可视化工具&#xff08;软…...

烤羊肉串引来的思考--命令模式

1.1 吃羊肉串&#xff01; 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱&#xff0c;由于人实在太多&#xff0c;烤羊肉串的老板已经分不清谁是谁&#xff0c;造成分发错误&#xff0c;收钱错误&#xff0c;烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…...

Python 描述符

文章目录 类型&#xff1a;数据描述符&#xff1a;方法描述符&#xff1a;描述符的要包括以下几点:方法描述符实现缓存 描述符(Descriptor)是 Python 中一个非常强大的特性,它允许我们自定义属性的访问行为。使用描述符,我们可以创建一些特殊的属性,在访问这些属性时执行自定义…...

Go语言创建HTTP服务器

Web服务器可提供网页、Web服务和文件,而Go语言为创建Web服务器提供了强大的支持。 1.通过Hello World Web 服务器宣告您的存在 标准库中的net/http包提供了多种创建HTTP服务器的方法,它还提供了一个基本的路由器。 package mainimport ("net/http" )func helloWo…...

【LeetCode热题100】【栈】柱状图中最大的矩形

题目链接&#xff1a;84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 要找最大的矩形就是要找以每根柱子为高度往两边延申的边界&#xff0c;要作为柱子的边界就必须高度不能低于该柱子&#xff0c;否则矩形无法同高&#xff0c;也就是需要找出以每根柱子为高…...

谷歌浏览器插件开发速成指南:弹窗

诸神缄默不语-个人CSDN博文目录 本文介绍谷歌浏览器插件开发的入门教程&#xff0c;阅读完本文后应该就能开发一个简单的“hello world”插件&#xff0c;效果是出现写有“Hello Extensions”的弹窗。 作为系列文章的第一篇&#xff0c;本文还希望读者阅读后能够简要了解在此基…...

Lakehouse 大数据概念

“Lakehouse” 是一个相对新的概念,是大数据理论中的一个重要发展方向。它试图结合传统的数据湖(Data Lake)和数据仓库(Data Warehouse)的优点,以创造一种更为灵活和强大的数据管理体系。 在传统的大数据架构中,数据湖用于存储原始、未加工的数据,而数据仓库则用于存储…...

MySQL学习笔记(二)

1、把查询结果中去除重复记录 2、连接查询 从一张表中单独查询&#xff0c;称为单表查询。emp表和dept表联合起来查询数据&#xff0c;从emp表中取员工名字&#xff0c;从dept表中取部门名字&#xff0c;这种跨表查询&#xff0c;多张表联合起来查询数据&#xff0c;被称为连…...

Verilog语法——按位取反“~“和位宽扩展的优先级

前言 先说结论&#xff0c;如下图所示&#xff0c;在Verilog中“~ ”按位取反的优先级是最高的&#xff0c;但是在等式计算时&#xff0c;有时候会遇到位宽扩展&#xff0c;此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码&#xff0c;下面代码验证的是“~”按位取…...

Navicat工具使用

Navicat的本质&#xff1a; 在创立连接时提前拥有了数据库用户名和密码 双击数据库时&#xff0c;相当于建立了一个链接关系 点击运行时&#xff0c;远程执行命令&#xff0c;就像在xshell上操作Linux服务器一样&#xff0c;将图像化操作转换成SQL语句去后台执行 一、打开Navi…...

linux常用指令(一)——mv、rm、which、find

mv命令&#xff1a; 用于查看文件内容 语法&#xff1a;mv 参数1 参数2 参数1&#xff0c;linux路径&#xff0c;表示被移动的文件或文件夹 参数2&#xff0c;linux路径&#xff0c;表示要移动去的地方&#xff0c;如果目标不存在&#xff0c;则进行改名 rm命令&#xff1a…...

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…...

深入理解指针2:数组名理解、一维数组传参本质、二级指针、指针数组和数组指针、函数中指针变量

目录 1、数组名理解 2、一维数组传参本质 3、二级指针 4、指针数组和数组指针 5、函数指针变量 1、数组名理解 首先来看一段代码&#xff1a; int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0; } 输出的结果是&…...

【C/C++】C语言实现单链表

C语言实现单链表 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED#define ELEM_TYPE int //!< 链表元素类型/*! brief 返回值类…...

VBA数据库解决方案第九讲:把数据库的内容在工作表中显示

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

蓝桥杯刷题-12-公因数匹配-数论(分解质因数)不是很理解❓❓

蓝桥杯2023年第十四届省赛真题-公因数匹配 给定 n 个正整数 Ai&#xff0c;请找出两个数 i, j 使得 i < j 且 Ai 和 Aj 存在大于 1 的公因数。 如果存在多组 i, j&#xff0c;请输出 i 最小的那组。如果仍然存在多组 i, j&#xff0c;请输出 i 最小的所有方案中 j 最小的那…...

机器视觉学习(十二)—— 绘制图形

目录 一、绘制函数参数说明 1.1 cv2.line(&#xff09;绘制直线 1.2 cv2.rectangle&#xff08;&#xff09;绘制矩形 1.3 cv2.circle&#xff08;&#xff09; 绘制圆形 1.4 cv2.ellipse&#xff08;&#xff09;绘制椭圆 1.5 cv2.polylines&#xff08;&#xff09;绘制…...

软考信息处理技术员2024年5月报名流程及注意事项

2024年5月软考信息处理技术员报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的…...

linux:du和df区别

文章目录 1. 概述2. du 命令2. df 命令3. 区别总结 1. 概述 du 和 df 都是 Linux 系统中用于查看磁盘空间使用情况的命令&#xff0c;但它们的功能和用法有所不同。 2. du 命令 du 是 “disk usage” 的缩写&#xff0c;用于显示文件或目录的磁盘使用情况。du 命令用于查看指…...