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

Java二十三种设计模式-命令模式(18/23)

命令模式:将请求封装为对象的策略

概要

本文全面探讨了命令模式,从基础概念到实现细节,再到使用场景、优缺点分析,以及与其他设计模式的比较,并提供了最佳实践和替代方案,旨在帮助读者深入理解命令模式并在实际开发中有效应用。

 基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:命令模式概述

1.1 定义与用途

命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成对象,允许用户使用不同的请求对客户进行参数化,并支持撤销操作。

命令模式是一种行为型设计模式,它将请求或操作封装为一个对象,这样你可以使用不同的请求、队列或日志请求来参数化其他对象,并支持撤销操作。

为何需要命令模式:

  • 解耦请求发送者与接收者:命令模式将请求发送者与接收者分离,提高系统的灵活性。
  • 支持撤销与重做:命令模式允许操作的撤销和重做,提高了用户体验。
  • 扩展性:允许系统在不修改现有代码的基础上扩展新命令。

1.2 命令模式的组成

命令(Command)

  • 定义:定义了执行操作的接口,包含执行命令的方法。
  • 职责:作为所有具体命令的抽象基类。

接收者(Receiver)

  • 定义:具体执行命令的对象,实现了命令接口中声明的操作。
  • 职责:接收命令请求并执行相应的操作。

调用者(Invoker)

  • 定义:要求命令对象执行请求。
  • 职责:维护命令对象的引用,并触发命令的执行。

客户端(Client)

  • 定义:创建具体的命令对象,并设置其接收者。
  • 职责:将调用者与命令对象关联,以便调用者可以执行命令。

角色之间的交互

  • 命令创建:客户端创建具体的命令对象,并将接收者传入命令对象。
  • 命令设置:调用者持有命令对象的引用,并在适当的时候调用命令的执行方法。
  • 命令执行:命令对象执行操作,接收者实际执行命令的细节。

命令模式通过将请求封装为对象,允许系统以统一的方式处理请求,同时支持撤销和重做操作。在下一部分中,我们将通过Java代码示例来展示命令模式的具体实现。

第二部分:命令模式的实现

2.1 Java实现示例

以下是使用Java语言实现命令模式的代码示例。假设我们有一个简单的文本编辑器,支持撤销和重做操作。

// 命令接口
interface Command {void execute();void undo();
}// 接收者:文本编辑器
class TextEditor {private String text;public TextEditor() {this.text = "";}public void setText(String text) {this.text = text;}public String getText() {return text;}
}// 具体命令:添加文本
class AppendTextCommand implements Command {private TextEditor editor;private String appendText;public AppendTextCommand(TextEditor editor, String appendText) {this.editor = editor;this.appendText = appendText;}@Overridepublic void execute() {editor.setText(editor.getText() + appendText);}@Overridepublic void undo() {int index = editor.getText().lastIndexOf(appendText);if (index >= 0) {editor.setText(editor.getText().substring(0, index));}}
}// 调用者:命令执行器
class CommandExecutor {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}// 客户端代码
public class Client {public static void main(String[] args) {TextEditor editor = new TextEditor();CommandExecutor executor = new CommandExecutor();Command appendCmd = new AppendTextCommand(editor, "Hello World!");executor.setCommand(appendCmd);executor.executeCommand();System.out.println(editor.getText()); // 输出: Hello World!// 执行撤销操作appendCmd.undo();System.out.println(editor.getText()); // 输出: (空)}
}

2.2 命令模式中的角色和职责

命令(Command)

  • 职责:定义了执行操作的接口,允许将请求封装为一个对象。

接收者(Receiver)

  • 职责:具体执行命令中包含的操作,是命令要作用的对象。

调用者(Invoker)

  • 职责:要求命令对象执行请求,维护对命令对象的引用。

客户端(Client)

  • 职责:创建具体的命令对象,将接收者与命令关联,并提供给调用者。

相互作用

  • 命令创建:客户端创建具体的命令对象,指定命令的接收者和必要的参数。
  • 命令设置:调用者接收命令对象,并在适当的时候执行命令。
  • 命令执行:调用者调用命令对象的execute方法来执行操作,调用undo方法来撤销操作。

命令模式通过将请求封装为对象,允许系统以统一的方式处理请求,并支持撤销和重做操作。这种模式在需要对操作进行记录、撤销或重做的场景中非常有用。在下一部分中,我们将探讨命令模式的使用场景。

第三部分:命令模式的使用场景

3.1 需要将操作封装为对象的场景

在软件系统中,经常需要将操作封装为对象,以实现对操作的统一管理和调度。

讨论在需要将操作封装为对象时,命令模式的应用:

  • 操作的参数化:命令模式允许将操作的参数封装在命令对象中,使得操作可以在不同的时间点执行。
  • 操作的队列管理:通过命令对象,可以轻松地将操作加入队列、存储或序列化。
  • 接口的统一:命令模式提供了一个统一的操作执行接口,简化了调用者对操作的调用。

应用实例:

  • 任务调度系统:在任务调度系统中,命令模式可以将不同的任务封装为命令对象,统一调度和管理。
  • 图形界面操作:在图形用户界面中,用户的各种操作(如点击、拖拽)可以封装为命令对象,以支持撤销和重做功能。

3.2 需要支持撤销操作的场景

撤销操作是许多应用程序中的一个常见需求,特别是在文本编辑器、图形编辑器和其他需要用户交互的应用程序中。

分析在需要支持撤销操作时,命令模式的优势:

  • 撤销和重做支持:命令模式天然支持撤销操作,因为它将操作封装为对象,可以很容易地实现撤销和重做。
  • 操作的可逆性:通过命令对象的undo方法,可以轻松实现操作的逆向操作,满足用户撤销的需求。
  • 操作历史记录:命令模式可以与历史记录机制结合,存储操作序列,实现多级撤销和重做。

应用实例:

  • 文本编辑器:在文本编辑器中,用户的每次编辑操作都可以封装为一个命令对象,支持撤销和重做。
  • 游戏开发:在游戏开发中,玩家的操作可以封装为命令对象,以实现回放、撤销等功能。

命令模式通过将操作封装为对象,提供了一种灵活的方式来管理和调度操作,特别适用于需要撤销和重做功能的应用程序。在下一部分中,我们将讨论命令模式的优点与缺点。

第四部分:命令模式的优点与缺点

4.1 优点

解耦请求发送者与接收者

  • 灵活性增强:命令模式允许请求发送者和接收者之间没有直接联系,增加了系统的灵活性。

支持撤销操作

  • 操作可逆性:通过实现命令的undo()方法,命令模式支持撤销操作,提高了用户体验。

支持重做操作

  • 操作可重复性:在撤销操作之后,可以提供重做机制来恢复之前的状态。

支持事务性操作

  • 事务一致性:可以将一系列命令组合成一个事务,确保操作的一致性。

易于扩展

  • 开闭原则:遵循开闭原则,系统对扩展开放,对修改封闭,易于添加新命令。

增强安全性

  • 权限控制:可以对命令对象进行权限控制,限制对某些操作的访问。

4.2 缺点

增加系统复杂性

  • 类的数量:引入命令模式可能会增加系统中类的数量,每个命令都需要一个单独的类。

增加系统的开销

  • 性能问题:如果命令对象过多,可能会对性能产生影响。

难以管理命令依赖

  • 依赖关系:在复杂的系统中,命令之间的依赖关系可能难以管理。

难以实现跨系统命令

  • 系统边界:在分布式系统中,实现跨系统或跨网络的命令可能较为复杂。

可能引入循环依赖

  • 依赖循环:不当的使用可能导致命令对象之间的循环依赖。

撤销栈管理

  • 内存消耗:如果系统需要支持大量的撤销操作,撤销栈可能会消耗大量内存。

命令模式通过将请求封装为对象,提供了一种灵活的方式来管理和调度操作,支持撤销和重做功能。然而,它也需要谨慎使用,以避免增加系统的复杂性和维护难度。在实际应用中,根据具体需求和场景选择是否使用命令模式是非常重要的。在下一部分中,我们将比较命令模式与其他设计模式,并提供一些最佳实践和建议。

第五部分:命令模式与其他模式的比较

5.1 与策略模式的比较

策略模式

  • 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互换。
  • 特点:策略模式关注于算法的封装和替换,通常用于多种算法或行为的动态选择。

命令模式

  • 定义:命令模式将请求或操作封装为一个对象,允许用户使用不同的请求对客户进行参数化。
  • 特点:命令模式关注于请求的封装,支持撤销和重做操作,以及请求的排队和记录。

对比

  • 封装内容:策略模式封装的是算法或行为,命令模式封装的是请求或操作。
  • 使用场景:策略模式适用于需要根据不同条件选择不同算法的场景,命令模式适用于需要对请求进行参数化处理的场景。

5.2 与观察者模式的对比

观察者模式

  • 定义:观察者模式定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知。
  • 特点:观察者模式关注于对象状态变化的广播机制,允许对象在状态变化时通知多个观察者。

命令模式

  • 定义:如前所述,命令模式关注于请求的封装和执行。

对比

  • 通信机制:观察者模式是一种对象间的通信机制,命令模式是一种请求的封装和执行机制。
  • 目的:观察者模式用于实现对象间的状态同步,命令模式用于将请求作为对象进行处理。

命令模式和策略模式、观察者模式都提供了处理对象间交互的不同方法。每种模式都有其独特的用途和优势,选择使用哪种模式取决于具体的设计需求和场景。在下一部分中,我们将提供命令模式的最佳实践和建议。

第六部分:命令模式的最佳实践和建议

6.1 最佳实践

确保命令的线程安全

  • 线程安全:确保命令对象在多线程环境中使用时是安全的,避免并发问题。

明确命令的撤销逻辑

  • 可逆操作:为每个命令实现清晰的撤销逻辑,确保undo()方法能够正确地撤销执行的操作。

使用宏命令简化复杂序列

  • 宏命令:当需要执行一系列命令时,使用宏命令来简化操作,作为一个整体进行撤销和重做。

定义清晰的命令执行和撤销接口

  • 接口规范:定义清晰的接口,如execute()undo(),确保所有命令遵循相同的规范。

考虑命令的持久化

  • 持久化存储:如果需要,实现命令的持久化机制,以便在系统重启后恢复命令状态。

保持命令的轻量级

  • 轻量设计:设计命令时应尽量保持轻量,避免命令对象过于复杂或庞大。

6.2 避免滥用

避免过度使用命令模式

  • 适用场景:只在确实需要将请求作为对象处理,或者需要撤销和重做功能时使用命令模式。

避免命令对象过于复杂

  • 简化设计:避免命令对象包含过多的逻辑,保持其职责单一。

避免滥用撤销和重做功能

  • 合理使用:不应过度依赖撤销和重做功能,这可能导致用户滥用,从而影响用户体验。

6.3 替代方案

使用函数式编程技术

  • 函数作为命令:在支持函数式编程的语言中,可以使用函数或函数式接口作为命令。

使用事件驱动模型

  • 事件作为命令:在事件驱动的系统中,可以使用事件来代替命令模式处理请求。

使用状态模式

  • 状态封装:当对象状态变化复杂时,可以使用状态模式来封装状态相关的操作。

使用策略模式

  • 算法封装:如果主要需求是根据不同条件选择不同的算法或行为,策略模式可能是更好的选择。

命令模式是一种强大的设计模式,用于将请求封装为对象,支持撤销和重做操作。合理使用命令模式并避免其缺点对于构建灵活、可维护的系统至关重要。了解其替代方案可以帮助开发者根据具体需求和场景选择最合适的设计模式。在实际开发中,应根据具体情况灵活运用命令模式,以达到最佳的设计效果。

结语

命令模式提供了一种强大的方法来封装操作,允许系统以不同的方式处理请求,并支持撤销操作。通过本文的深入分析,希望读者能够对命令模式有更全面的理解,并在实际开发中做出合理的设计选择。


博主还写了其他Java设计模式关联文章,请各位大佬批评指正:

(一)创建型模式(5种):

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

(二)结构型模式(7种): 

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23)

Java二十三种设计模式-代理模式(8/23)

Java二十三种设计模式-外观模式(9/23)

Java二十三种设计模式-桥接模式(10/23)

Java二十三种设计模式-组合模式(11/23)

Java二十三种设计模式-享元模式(12/23)

 (三)行为型模式(11种): 

Java二十三种设计模式-策略模式(13/23)

Java二十三种设计模式-模板方法模式(14/23)

Java二十三种设计模式-观察者模式(15/23)

Java二十三种设计模式-迭代子模式(16/23)

Java二十三种设计模式-责任链模式(17/23)

持续更新中......敬请关注

相关文章:

Java二十三种设计模式-命令模式(18/23)

命令模式:将请求封装为对象的策略 概要 本文全面探讨了命令模式,从基础概念到实现细节,再到使用场景、优缺点分析,以及与其他设计模式的比较,并提供了最佳实践和替代方案,旨在帮助读者深入理解命令模式并…...

Kafka系列之:Dead Letter Queue死信队列DLQ

Kafka系列之:Dead Letter Queue死信队列DLQ 一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客: Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列一、死信队列 死信队列(DLQ)仅适用于接…...

Fragment学习笔记

静态加载 <fragment android:name"com.example.serviceapplication.fragment.TestFragment"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintStart_toStartOf"parent"app:layout_cons…...

NGINX 基础参数与功能

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 实现 Nginx 账户认证功能 1.1 创建htpasswd 认证文件 1.2 创建数据目录 1.3 指定认证文件路径 1.4 测试效果 2 定义重定向错误日志 2.1 指定错误日志访问路…...

css设置元素居中显示

CSS中实现居中显示可以通过不同的属性来实现&#xff0c;取决于你是要水平居中还是垂直居中&#xff0c;或者两者都要。以下是一些常用的居中方法&#xff1a; 1.水平居中 - 行内元素或文本 .center-text {text-align: center; } 2.水平居中 - 块级元素 .center-block {mar…...

js判断一个任意值为空包括数组和对象

在JavaScript中&#xff0c;判断一个变量是否为空可以考虑以下几种情况&#xff1a; 如果变量可能是null或undefined&#xff0c;可以直接判断。 对于数组&#xff0c;如果想要判断数组为空&#xff08;长度为0&#xff09;&#xff0c;可以检查其length属性。 对于对象&…...

EmguCV学习笔记 VB.Net和C# 下的OpenCv开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 笔者的博客网址&#xff1a;https://blog.csdn.net/uruseibest 本教程将分为VB.Net和C#两个版本分别进行发布。 教程VB.net版本请…...

“TCP粘包”不是TCP的问题!

前言 写RPC用了Netty。涉及到粘包拆包问题。想复习一下。发现网上博客多是概念模糊不清。没有触及本质或者没有讲清楚。 遂决定自己写一篇 “TCP粘包”是谁的问题&#xff1f; 首先我们要明确TCP是面向字节流的协议。也就是说我们在应用层想使用TCP来传输数据时&#xff0c;…...

Electron项目依赖管理:最佳实践与常见错误

问题一 问题描述: 输入命令 pnpm add electron 后&#xff0c; electron 包在执行 postinstall 脚本时&#xff0c;尝试从网络上下载 Electron 二进制文件&#xff0c;但由于网络问题&#xff08;如连接超时或代理设置问题&#xff09;&#xff0c;导致下载失败。 λ pnpm a…...

华为数通路由交换HCIP/HCNP

2017-2022年软考高级网络规划设计师真题解析视频&#xff01;软考复习一定要多做历年真题&#xff01; 2022年软考网络规划设计师真题解析_哔哩哔哩_bilibili 2024年5月软考网络工程师真题解析合集&#xff0c;考后估分版【综合知识案例分析】 2024年5月软考网络工程师真题解…...

搜索面试题

1、目前怎么构建样本的&#xff1f;如果排序中第5个被点了&#xff0c;前面的作为负样本&#xff0c;后面的不要怎么样&#xff1b;为什么不好&#xff0c;为什么好。 点击作为负样本&#xff0c;曝光未点击作为负样本&#xff1b; 可以这样理解。您提到的排序中第5个被点的对…...

WPF学习(8) --Windows API函数的使用

一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄&#xff08;IntPtr…...

Linux系统-用户账号文件

文章目录 文件一&#xff08;passwd&#xff09; 文件二&#xff08;shadow&#xff09; 加密密码部分 举例理解 文件三&#xff08;gshadow&#xff09; 文件四&#xff08;group&#xff09; 文件五&#xff08;skel&#xff09; 文件六&#xff08;login.defs&#…...

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...

C语言实现排序之堆排序算法

一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法&#xff0c;其基本思想是&#xff1a; 构建最大堆&#xff1a;首先将待排序的数组构建成一个最大堆&#xff0c;即对于每个非叶子节点&#xff0c;它的值都大于或等于其子节点的值。排序&#xff1a;然后将堆顶元素…...

【STM32 Blue Pill编程】-外部中断配置及使用

外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...

MySQL 安装与配置教程:单机、主从复制与集群模式

目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;具有高性能、高可靠性和易用性等特点。它支持多种部署模式&#xff0c;包括单机模式、主从复制模式&#xff08;用于高…...

JavaEE 的相关知识点(一)

一、过滤器 过滤器&#xff08;Filter&#xff09;是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用&#xff0c;通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术&#xff0c;可以让请求达到目标servlet之…...

使用Python实现深度学习模型:智能医疗影像识别与诊断

介绍 智能医疗影像识别与诊断是现代医疗技术的重要应用,通过深度学习模型,可以自动分析和识别医疗影像,提高诊断的准确性和效率。本文将介绍如何使用Python和深度学习技术来实现智能医疗影像识别与诊断。 环境准备 首先,我们需要安装一些必要的Python库: pip install …...

24.给定一个链表,实现一个算法交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。

24. Swap Nodes in Pairs 题目 给定一个链表,交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。 Example: Given 1->2->3->4, you should return the list as 2->1->4->3....

Python 通过UDP传输超过64k的信息

Python 通过UDP传输超过64k的信息 在网络编程中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是一种常用的传输协议。与TCP不同&#xff0c;UDP是无连接的&#xff0c;并且不保证数据包的顺序、完整性及交付。尽管如此&#xff0c;UDP因其较低的延迟和开销而被广泛应…...

微服务设计原则——高性能:批量

能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作&#xff0c;那么这个接口设计就可能有问题。 比如获取数据的接口&#xff0c;如果仅仅提供getData(int id)接口&#xff0c;那么使用方如果要一次性获取 20 个数据&#xff0c;它就需要循环遍历调用…...

C:指针学习-指针变量—学习笔记

今日伊雷娜&#xff1a; 目录 前言&#xff1a; 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量&#xff1f; 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …...

【MySQL 07】表的增删查改 (带思维导图)

文章目录 &#x1f308; 一、insert 添加数据⭐ 1. 单行数据 全列插入⭐ 2. 多行数据 指定列插入⭐ 3. 插入否则更新⭐4. 插入否则替换 &#x1f308; 二、select 查询数据⭐ 1. select 列&#x1f319; 1.1 全列查询&#x1f319; 1.2 指定列查询&#x1f319; 1.3 查询字段…...

快速上手Git

Git相关概念 Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds在2005年创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。它是由 Linux 之父 Linus Torvalds 开发的&#xff0c;并已经成为了现代软件开发领域中最流行的版本控制系统之一。 git的工…...

RTC时钟测试

1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock&#xff0c;简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟&#xff0c;而硬件时钟则是主板上由电池供电的时钟&#xff0c;这个硬件时钟可以在BIO…...

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表&#xff0c;要求具备交互功能&#xff0c;以及进行自助分析的能力&#xff0c;…...

Android studio模拟制作-简易的订餐交易小案例

一、最终呈现效果 订餐支付小案例效果 二、布局设计activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…...

【Vue3】路由Params传参

【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…...

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限

CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件&#xff0c;同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾&#xff0c;快速释放磁盘内存&#xff0c;缓解卡顿现象&#xff0c;保障系统顺畅地运行。 全磁盘访问权限&#xff0c;就好比机场内进行的安全检查。…...

Ubuntu/18.04 LTS下编译 BoringSSL 库

1、准备一个 Ubuntu/18.04 LTS 系统的设备 2、安装软件 GIT、GCC、CMAKE、G、Golang:1.16 及以上版本 3、克隆仓库源 git clone https://boringssl.googlesource.com/boringssl cd boringssl 4、使用特定版本 git checkout 9fc1c33e9c21439ce5f87855a6591a9324e569fd 5、编…...

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…...

xss靶场详解

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边&#xff0c;innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的&#xff0c;这里是访问spaghet这个元素的&#xff0c;并通过括号里面的东西搜索当前…...

华为的流程管理

华为建设流程体系始于2000年&#xff0c;那时华为公司面临着快速扩张和全球化发展的挑战&#xff0c;意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势&#xff0c;华为决定启动流程体系的建设。在建设过程中&#xff0c;华为借鉴了业界最佳…...

操作系统Linux

1.Linux命令 ls&#xff1a;查看当前目录下所有目录和文件ps&#xff1a;查看所有正在运行的进程top&#xff1a;显示当前系统中占用资源最多的一些进程&#xff0c;shiftm按照内存查看大小netstat&#xff1a;查看端口的命令vi&#xff1a;查看文件的命令rm&#xff1a;删除文…...

1、.Net UI框架:MAUI - .Net宣传系列文章

.NET MAUI(Multi-platform App UI)是一个跨平台的UI框架&#xff0c;它是.NET统一应用模型的一部分&#xff0c;允许开发者使用C#和.NET来创建适用于iOS、Android、macOS和Windows的应用程序。MAUI继承了Xamarin.Forms的一些概念&#xff0c;但提供了更多的原生平台集成和改进的…...

Spring boot 使用 jSerialComm 对串口使用发送信息并接收

什么是 jSerialComm&#xff1f; jSerialComm 是一个 Java 库&#xff0c;旨在提供一种独立于平台的方式来访问标准串行端口&#xff0c;而无需外部库、本机代码或任何其他工具。它旨在替代 RxTx 和&#xff08;已弃用的&#xff09;Java Communications API&#xff0c;具有更…...

江协科技STM32学习笔记(第10章 SPI通信)

第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线&#xff1b; 串行外设接口&#xff1b; I2C无论是软件还是软件电路&#xff0c;设计的都还是比较复杂的&#xff0c;硬件…...

力扣热题100_回溯_22_括号生成

文章目录 题目链接解题思路解题代码 题目链接 22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()…...

【k8s】ubuntu24.04 containerd 手动从1.7.15 换为1.7.20

24.04的这个应该是apt 安装的1.7.20-1 root@k8s-master-pfsrv:~# sudo apt update && sudo apt install containerd.io -y 命中:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu noble InRelease 命中:2 https://dl.google.com/linux/chrome/deb stable InRelease…...

Java二十三种设计模式-备忘录模式(19/23)

本文深入探讨了备忘录模式&#xff0c;从定义、组成、实现到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;全面解析了如何在软件开发中有效地保存和恢复对象状态&#xff0c;以支持复杂的撤销操作和历史状态管理。 备忘录模式&#xff1a…...

js一些杂乱理解

js 的值类型和引用类型 引用类型:object,array,function值类型:诸如number,stringboolean,null,Undefined,Symbol js使用变量访问对象属性示例 var myDog "Hunter"; var dogs { Fido: "Mutt", Hunter: "Doberman", Snoopie: "Beagle&q…...

机器学习 之 线性回归算法

目录 线性回归&#xff1a;理解与应用 什么是线性回归&#xff1f; 一元线性回归 正态分布的重要性 多元线性回归 实例讲解 数据准备 数据分析 构建模型 训练模型 验证模型 应用模型 代码实现 线性回归&#xff1a;理解与应用 线性回归是一种广泛使用的统计方法&…...

ThreadLoad如何防止内存溢出

优质博文&#xff1a;IT-BLOG-CN 从 ThreadLocalMap看 ThreadLocal使用不当的内存泄漏问题 【1】基础概念 &#xff1a; 首先我们先看看ThreadLocalMap的类图&#xff0c;我们知道 ThreadLocal只是一个工具类&#xff0c;他为用户提供get、set、remove接口操作实际存放本地变…...

2024.8.19 学习记录 —— 作业

一、TCP机械臂测试 #include <myhead.h>#define SER_PORT 8888 // 与服务器保持一致 #define SER_IP "192.168.0.114" // 服务器ip地址int main(int argc, const char *argv[]) {// 创建文件描述符打开键盘文件int fd open("/dev/input/event1…...

Java 阿里云视频直播开发流程

首先来看一下直播效果 推流工具有很多种&#xff08;例如OBS、阿里云直播Demo推流、等等&#xff0c;我用的是芯象导播&#xff09;阿里播放器地址 一、直播基础服务概述 官方文档说明 二、直播域名配置需要两个域名&#xff08;推流域名、播流域名&#xff09; 官方文档说…...

SQLite 轻量级的嵌入式关系型数据库的替代软件

SQLite 是一个轻量级的嵌入式关系型数据库&#xff0c;由于其简单易用和跨平台的特性&#xff0c;被广泛应用于各种应用程序中。以下是一些可作为SQLite替代品的数据库软件或可视化管理工具&#xff1a; 1. **SQLiteStudio**&#xff1a;这是一个免费、开源的跨平台SQLite数据…...

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…...

群晖NAS本地搭建可远程交互的大型语言模型LLM聊天机器人

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 前言 本文主要分享如何在群晖NAS本地部署并运行一个基于大语言模型Llama 2的个人本地聊天机器人并结合内网穿透工具…...