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

设计模式学习(三)

行为模式

职责链模式(Chain of Responsibility Pattern)

定义

它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。职责链模式将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

职责链模式的角色
  • 处理器接口(Handler):定义处理请求的接口,通常包含一个方法用于处理请求和一个方法用于设置下一个处理器。
  • 具体处理器(Concrete Handler):实现处理器接口,负责处理请求。如果自己不能处理,则将请求传递给下一个处理器。
  • 客户端(Client):创建职责链,并向链上的第一个处理器提交请求。

假设我们有一个审批流程,需要多个级别的审批人(如经理、总监、CEO)来处理请求。我们可以使用职责链模式来实现这个流程。

// 处理器接口:审批人
interface Approver {void setNextApprover(Approver nextApprover);void processRequest(PurchaseRequest request);
}
// 具体处理器:经理
class Manager implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 1000) {System.out.println("Manager approves the request for $" + request.getAmount());} else if (nextApprover != null) {nextApprover.processRequest(request);}}
}// 具体处理器:总监
class Director implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 5000) {System.out.println("Director approves the request for $" + request.getAmount());} else if (nextApprover != null) {nextApprover.processRequest(request);}}
}// 具体处理器:CEO
class CEO implements Approver {@Overridepublic void setNextApprover(Approver nextApprover) {// CEO 是最后一个审批人,没有下一个审批人}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() <= 10000) {System.out.println("CEO approves the request for $" + request.getAmount());} else {System.out.println("Request for $" + request.getAmount() + " requires a board meeting.");}}
}
// 请求类:采购请求
class PurchaseRequest {private double amount;public PurchaseRequest(double amount) {this.amount = amount;}public double getAmount() {return amount;}
}
public class ChainOfResponsibilityPatternDemo {public static void main(String[] args) {// 创建审批人Approver manager = new Manager();Approver director = new Director();Approver ceo = new CEO();// 设置职责链manager.setNextApprover(director);director.setNextApprover(ceo);// 创建采购请求PurchaseRequest request1 = new PurchaseRequest(800);PurchaseRequest request2 = new PurchaseRequest(4500);PurchaseRequest request3 = new PurchaseRequest(12000);// 处理请求manager.processRequest(request1);manager.processRequest(request2);manager.processRequest(request3);}
}
jdk或者android系统上的应用
  • Java 异常处理

Java 的异常处理机制是职责链模式的一个典型应用。当一个异常被抛出时,它会沿着调用栈向上传递,直到找到能够处理该异常的 catch 块。

try {// 可能会抛出异常的代码
} catch (NullPointerException e) {System.out.println("Caught NullPointerException");
} catch (Exception e) {System.out.println("Caught Exception");
}
  • Android事件分发机制

Android 的事件分发机制是职责链模式的一个典型应用。当用户触摸屏幕时,触摸事件会从 Activity 传递到 ViewGroup,再传递到具体的 View,直到有 View 处理该事件。

@Override
public boolean onTouchEvent(MotionEvent event) {// 处理触摸事件return super.onTouchEvent(event);
}

命令模式(Command Pattern)

定义

它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录日志、撤销等操作。命令模式的核心思想是将“请求”抽象为一个独立的对象,从而解耦请求的发送者和接收者。

命令模式的角色
  • 命令接口(Command):定义执行操作的接口。
  • 具体命令(Concrete Command):实现命令接口,封装具体的操作。
  • 接收者(Receiver):执行具体操作的对象。
  • 调用者(Invoker):持有命令对象,并调用命令的执行方法。
  • 客户端(Client):创建命令对象并设置其接收者。

假设我们有一个遥控器,可以控制多种家电(如灯、风扇等)。我们可以使用命令模式来实现遥控器的功能。

// 命令接口
interface Command {//执行命令void execute();
}
// 具体命令:开灯
class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}
}// 具体命令:关灯
class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.off();}
}// 具体命令:开风扇
class FanOnCommand implements Command {private Fan fan;public FanOnCommand(Fan fan) {this.fan = fan;}@Overridepublic void execute() {fan.on();}
}// 具体命令:关风扇
class FanOffCommand implements Command {private Fan fan;public FanOffCommand(Fan fan) {this.fan = fan;}@Overridepublic void execute() {fan.off();}
}
// 接收者:灯
class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off");}
}// 接收者:风扇
class Fan {public void on() {System.out.println("Fan is on");}public void off() {System.out.println("Fan is off");}
}
// 调用者:遥控器
class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
public class CommandPatternDemo {public static void main(String[] args) {// 创建接收者Light light = new Light();Fan fan = new Fan();// 创建具体命令Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);Command fanOn = new FanOnCommand(fan);Command fanOff = new FanOffCommand(fan);// 创建调用者RemoteControl remote = new RemoteControl();// 控制灯remote.setCommand(lightOn);remote.pressButton(); // 输出: Light is onremote.setCommand(lightOff);remote.pressButton(); // 输出: Light is off// 控制风扇remote.setCommand(fanOn);remote.pressButton(); // 输出: Fan is onremote.setCommand(fanOff);remote.pressButton(); // 输出: Fan is off}
}
jdk或者android系统上的应用
  • Runnable 接口

Java 的 Runnable 接口是命令模式的一个典型应用。Runnable 封装了一个任务,而 Thread 是调用者,负责执行任务。

// 命令接口
Runnable task = new Runnable() {@Overridepublic void run() {System.out.println("Task is running");}
};// 调用者
Thread thread = new Thread(task);
thread.start();
  • Handler 和 Message

在 Android 中,Handler 和 Message 是命令模式的一个典型应用。Message 封装了一个任务,而 Handler 是调用者,负责处理任务。

// 命令接口
Message message = Message.obtain(handler, new Runnable() {@Overridepublic void run() {System.out.println("Message is handled");}
});// 调用者
Handler handler = new Handler(Looper.getMainLooper());
handler.sendMessage(message);

解释器模式(Interpreter Pattern)

定义

它定义了一种语言的语法表示,并使用解释器来解释语言中的句子。这种模式通常用于需要解释和执行特定语法规则的场景,例如编译器、正则表达式引擎等。

解释器模式的角色
  • 抽象表达式(AbstractExpression):定义解释操作的接口。
  • 终结符表达式(TerminalExpression):实现与文法中的终结符相关的解释操作。
  • 非终结符表达式(NonterminalExpression):实现与文法中的非终结符相关的解释操作。
  • 上下文(Context):包含解释器需要的全局信息。
  • 客户端(Client):构建抽象语法树并调用解释操作。

假设我们需要解释简单的数学表达式,例如 1 + 2 - 3。我们可以使用解释器模式来实现这个功能。

//定义抽象接口
interface Expression {int interpret(Context context);
}
//定义终结符表达式
class NumberExpression implements Expression {private int number;public NumberExpression(int number) {this.number = number;}@Overridepublic int interpret(Context context) {return number;}
}
//定义非终结符表达式
class AddExpression implements Expression {private Expression left;private Expression right;public AddExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) + right.interpret(context);}
}class SubtractExpression implements Expression {private Expression left;private Expression right;public SubtractExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {return left.interpret(context) - right.interpret(context);}
}
//定义上下文
class Context {// 这里可以包含解释器需要的全局信息
}
public class InterpreterPatternDemo {public static void main(String[] args) {Context context = new Context();// 构建表达式:1 + 2 - 3Expression expression = new SubtractExpression(new AddExpression(new NumberExpression(1), new NumberExpression(2)),new NumberExpression(3));// 解释并输出结果int result = expression.interpret(context);System.out.println("Result: " + result);  // 输出: Result: 0}
}
jdk或者android系统上的应用

迭代器模式(Iterator Pattern)

定义

它提供了一种顺序访问聚合对象(如列表、集合等)中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出来,使得聚合对象和遍历逻辑可以独立变化。

迭代器模式的角色
  • 迭代器接口(Iterator):定义遍历和访问元素的方法。
  • 具体迭代器(ConcreteIterator):实现迭代器接口,负责管理当前遍历的位置。
  • 聚合接口(Aggregate):定义创建迭代器的方法。
  • 具体聚合类(ConcreteAggregate):实现聚合接口,返回一个具体迭代器的实例。

假设我们有一个自定义的集合类 MyCollection,它存储了一组整数。我们希望提供一个迭代器来遍历这个集合中的元素。

  1. 定义迭代器接口
interface Iterator<T> {boolean hasNext();  // 检查是否还有下一个元素T next();           // 返回下一个元素
}
  1. 定义具体迭代器
class MyCollectionIterator implements Iterator<Integer> {private int[] collection;private int position = 0;public MyCollectionIterator(int[] collection) {this.collection = collection;}@Overridepublic boolean hasNext() {return position < collection.length;}@Overridepublic Integer next() {if (this.hasNext()) {return collection[position++];}throw new IndexOutOfBoundsException("No more elements");}
}
  1. 定义聚合接口
interface Aggregate<T> {Iterator<T> createIterator();  // 创建迭代器
}
  1. 定义具体聚合类
class MyCollection implements Aggregate<Integer> {private int[] items;public MyCollection(int[] items) {this.items = items;}@Overridepublic Iterator<Integer> createIterator() {return new MyCollectionIterator(items);}
}
public class IteratorPatternDemo {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};MyCollection collection = new MyCollection(numbers);// 获取迭代器Iterator<Integer> iterator = collection.createIterator();// 遍历集合while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
迭代器模式的优缺点

优点:

  • 将遍历逻辑与聚合对象分离,符合单一职责原则。
  • 提供了一种统一的方式来遍历不同类型的聚合对象。
  • 支持多种遍历方式(例如正向遍历、反向遍历)。

缺点:

  • 对于简单的集合,使用迭代器可能会增加代码的复杂性。
  • 如果集合的结构发生变化,可能需要修改迭代器的实现。
jdk或者android系统上的应用

Java 的集合框架(如 List、Set、Map)已经内置了迭代器模式。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class JavaIteratorExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");// 使用 Java 内置的迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

中介者模式(Mediator Pattern)

定义

它通过引入一个中介者对象来封装一组对象之间的交互。中介者模式减少了对象之间的直接依赖,使得对象之间的耦合度降低,从而更容易维护和扩展。

迭代器模式的角色
  • 中介者接口(Mediator):定义对象之间通信的接口。
  • 具体中介者(ConcreteMediator):实现中介者接口,协调各个对象之间的交互。
  • 同事类(Colleague):定义各个对象的接口,每个同事类都知道中介者对象。
  • 具体同事类(ConcreteColleague):实现同事类接口,负责与其他同事类通信。

假设我们有一个聊天室系统,多个用户可以通过聊天室发送消息。聊天室作为中介者,负责将消息从一个用户传递给其他用户。

  1. 定义中介者接口
interface ChatMediator {void sendMessage(String message, User user);  // 发送消息void addUser(User user);                      // 添加用户
}
  1. 定义具体中介者
class ChatRoom implements ChatMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(String message, User user) {for (User u : users) {// 不将消息发送给自己if (u != user) {u.receive(message);}}}@Overridepublic void addUser(User user) {this.users.add(user);}
}
  1. 定义同事类
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);  // 发送消息public abstract void receive(String message);  // 接收消息
}
  1. 定义具体同事类
class ChatUser extends User {public ChatUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(this.name + " 发送消息: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(this.name + " 收到消息: " + message);}
}
  1. 客户端代码
public class MediatorPatternDemo {public static void main(String[] args) {// 创建中介者(聊天室)ChatMediator chatRoom = new ChatRoom();// 创建用户User user1 = new ChatUser(chatRoom, "Hehe");User user2 = new ChatUser(chatRoom, "Bob");User user3 = new ChatUser(chatRoom, "Charlie");// 将用户添加到聊天室chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);// 用户发送消息user1.send("大家好!");user2.send("你好,Hehe!");user3.send("欢迎来到聊天室!");}
}

备忘录模式(Memento Design Pattern)

定义

它允许在不暴露对象实现细节的情况下保存和恢复对象的状态。该模式主要用于实现撤销(undo)操作。

备忘录模式的角色
  • 发起人(Originator):创建并恢复备忘录的对象。
  • 备忘录(Memento):存储发起人内部状态的快照,并防止其他对象访问备忘录。备忘录通常只有发起人可以访问其内容。
  • 负责人(Caretaker):负责管理备忘录,但不能查看或修改备忘录的内容。

使用备忘录模式来实现一个文本编辑器的撤销功能。

  1. 发起人(Originator)
public class TextEditor {private String content;public TextEditor(String content) {this.content = content;}public void type(String words) {content += words;}// 创建备忘录public Memento saveStateToMemento() {return new Memento(content);}// 从备忘录恢复状态public void getStateFromMemento(Memento memento) {this.content = memento.getContent();}public String getContent() {return content;}
}
  1. 备忘录(Memento)
public class Memento {private String content;// 私有构造函数,防止外部实例化private Memento(String content) {this.content = content;}public Memento(TextEditor originator) {this.content = originator.getContent();}public String getContent() {return content;}
}
  1. 负责人(Caretaker)
import java.util.ArrayList;
import java.util.List;public class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void add(Memento state) {mementoList.add(state);}public Memento get(int index) {return mementoList.get(index);}
}
public class Client {public static void main(String[] args) {TextEditor editor = new TextEditor("Hello");Caretaker caretaker = new Caretaker();editor.type(" world");caretaker.add(editor.saveStateToMemento());editor.type("!!!");System.out.println("Current Content: " + editor.getContent()); // Hello world!!!// 撤销到上一个状态editor.getStateFromMemento(caretaker.get(0));System.out.println("After Undo: " + editor.getContent()); // Hello world}
}

相关文章:

设计模式学习(三)

行为模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09; 定义 它允许多个对象有机会处理请求&#xff0c;从而避免请求的发送者与接收者之间的耦合。职责链模式将这些对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有对象处理它为止…...

挑战项目 --- 微服务编程测评系统(在线OJ系统)

一、前言 1.为什么要做项目 面试官要问项目&#xff0c;考察你到底是理论派还是实战派&#xff1f; 1.希望从你的项目中看到你的真实能力和对知识的灵活运用。 2.展示你在面对问题和需求时的思考方式及解决问题的能力。 3.面试官会就你项目提出一些问题&#xff0c;或扩展需求…...

堆(Heap)的原理与C++实现

1. 什么是堆&#xff1f; 堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;通常用于实现优先队列。堆可以分为两种类型&#xff1a; 最大堆&#xff08;Max Heap&#xff09;&#xff1a;每个节点的值都大于或等于其子节点的值。最小堆&#xff08;Min H…...

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…...

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪 里&#xff0c;但是照样可以链接成功&#…...

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…...

vim-plug的自动安装与基本使用介绍

vim-plug介绍 Vim-plug 是一个轻量级的 Vim 插件管理器&#xff0c;它允许你轻松地管理 Vim 插件的安装、更新和卸载。相较于其他插件管理器&#xff0c;vim-plug 的优点是简单易用&#xff0c;速度较快&#xff0c;而且支持懒加载插件&#xff08;即按需加载&#xff09; 自动…...

Python 自学秘籍:开启编程之旅,人生苦短,我用python。

从2009年&#xff0c;用了几次python后就放弃了&#xff0c;一直用的php&#xff0c;现在人工智能时代&#xff0c;完全没php什么事情。必须搞python了&#xff0c;虽然已经40多岁了。死磕python了。让滔滔陪着你一起学python 吧。 开启新世界 在当今人工智能化的时代&#xff…...

DRGDIP 2.0时代下基于PostgreSQL的成本管理实践与探索(上)

一、引言 1.1 研究背景与意义 在医疗领域的改革进程中&#xff0c; DRG/DIP 2.0 时代&#xff0c;医院成本管理的重要性愈发凸显。新的医保支付方式下&#xff0c;医院的收入不再单纯取决于医疗服务项目的数量&#xff0c;而是与病种的分组、费用标准以及成本控制紧密相关。这…...

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法&#xff0c;如 SplitViewController。 文件名采用大驼峰法&#xff0c;如BlockOperation.swift。 对于扩展文件&#xff0c;有时扩展定义在一个独立的文件中&#xff0c;用“原始类型名 扩展名…...

Vue的状态管理:用响应式 API 做简单状态管理、状态管理库(Pinia )

文章目录 引言单向数据流多个组件共享一个共同的状态I 用响应式 API 做简单状态管理使用 reactive()创建一个在多个组件实例间共享的响应式对象使用ref()返回一个全局状态II 状态管理库Pinia枚举状态管理引言 单向数据流 每一个 Vue 组件实例都在“管理”它自己的响应式状态了…...

排序算法--希尔排序

希尔排序是插入排序的改进版本&#xff0c;适合中等规模数据排序&#xff0c;性能优于简单插入排序。 // 希尔排序函数 void shellSort(int arr[], int n) {// 初始间隔&#xff08;gap&#xff09;为数组长度的一半&#xff0c;逐步缩小for (int gap n / 2; gap > 0; gap …...

HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录 1.时钟选择(这里选择高速外部时钟) ​编辑 2.调试模式和时基源选择: 3.LED的GPIO配置 这里用板子的红灯PB5 4.工程配置 5.1ms的systick中断实现led闪烁 源码: 6.修改systick的中断频率 7.systick定时原理 SysTick 定时器的工作原理 中断触发机制 HAL_SYSTICK_Co…...

ESXI虚拟机中部署docker会降低服务器性能

在 8 核 16GB 的 ESXi 虚拟机中部署 Docker 的性能影响分析 在 ESXi 虚拟机中运行 Docker 容器时&#xff0c;性能影响主要来自以下几个方面&#xff1a; 虚拟化开销&#xff1a;ESXi 虚拟化层和 Docker 容器化层的叠加。资源竞争&#xff1a;虚拟机与容器之间对 CPU、内存、…...

前端 | JavaScript中的reduce方法

1. 什么是reduce reduce 方法是 JavaScript 中数组的重要方法之一&#xff0c;用于对数组中的元素进行累积计算。它接收一个回调函数作为参数&#xff0c;并返回一个最终计算结果。reduce 在许多场景下都非常有用&#xff0c;比如求和、数组扁平化、对象计数、数据转换等。 2…...

基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要

前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…...

将OneDrive上的文件定期备份到移动硬盘

背景&#xff1a; 我在oneDrive上存了很多文件&#xff0c;分布在多个文件夹中&#xff0c;也有套了好几层文件夹的情况。我希望每隔一段时间&#xff0c;将oneDrive上的所有文件向移动硬盘上拷贝一份&#xff0c;但是我只想将距离上一次向移动硬盘拷贝的文件相比&#xff0c;发…...

01vue3实战-----前言

01vue3实战-----前言 1.大前端时代2.技术栈3.项目大致展示4.创建Vue项目4.1Vue CLI4.2create-vue 5.参考资料 1.大前端时代 前端移动端iOS/android开发桌面端 window/mac 常用的electron框架来开发其它平台:穿戴设备、车载系统(智能汽车)、VR、AR…web3方向 2.技术栈 开发工…...

SQL 秒变三线表 sql导出三线表

&#x1f3af;SQL 秒变三线表&#xff0c;校园小助手超神啦 宝子们&#xff0c;搞数据分析、写论文的时候&#xff0c;从 SQL 里导出数据做成三线表是不是特别让人头疼&#x1f629; 手动调整格式&#xff0c;不仅繁琐&#xff0c;还容易出错&#xff0c;分分钟把人逼疯&#…...

C_位运算符及其在单片机寄存器的操作

C语言的位运算符用于直接操作二进制位&#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符&#xff08;&&#xff09; 功能&#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…...

Rust错误处理:从灭火器到核按钮的生存指南

开篇&#xff1a;错误处理的生存哲学 在Rust的平行宇宙里&#xff0c;错误分为两种人格&#xff1a; panic! → 核按钮&#x1f4a3;&#xff08;不可恢复&#xff0c;全系统警报&#xff09;Result → 灭火器&#x1f9ef;&#xff08;可控制&#xff0c;局部处理&#xff0…...

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…...

对象的实例化、内存布局与访问定位

一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令&#xff0c;首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化…...

Java面试题2025-并发编程进阶(线程池和并发容器类)

线程池 一、什么是线程池 为什么要使用线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可…...

Vue Router 客户端路由解决方案:axios 响应拦截(跳转到登录页面)

文章目录 引言客户端路由 vs. 服务端路由简单的路由案例术语I Vue Router 提供的组件RouterLinkRouterViewII 创建路由器实例调用 createRouter() 函数创建路由选项III 注册路由器插件通过调用 use() 来完成注册路由器插件的职责对于组合式 API,Vue Router 给我们提供了一些组…...

Redis的通用命令

⭐️前言⭐️ 本文主要介绍Redis的通用命令 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHub &#x1f4cd;内容导…...

[Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建回归神经网络。这篇文章将介绍如何利用PyTorch构建神经网络实现分类预测,其是使用基础模块构建。前面我们的Python人工智能主要以TensorFlow和Keras为主,而现在最主流的深度学习框…...

SpringBoot使用 easy-captcha 实现验证码登录功能

文章目录 一、 环境准备1. 解决思路2. 接口文档3. redis下载 二、后端实现1. 引入依赖2. 添加配置3. 后端代码实现4. 前端代码实现 在前后端分离的项目中&#xff0c;登录功能是必不可少的。为了提高安全性&#xff0c;通常会加入验证码验证。 easy-captcha 是一个简单易用的验…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…...

Unity中的虚拟相机(Cinemachine)

Unity Cinemachine详解 什么是Cinemachine Cinemachine是Unity官方推出的智能相机系统&#xff0c;它提供了一套完整的工具来创建复杂的相机运动和行为&#xff0c;而无需编写大量代码。它能够大大简化相机管理&#xff0c;提高游戏开发效率。 Cinemachine的主要组件 1. Vi…...

响应式编程_04Spring 5 中的响应式编程技术栈_WebFlux 和 Spring Data Reactive

文章目录 概述响应式Web框架Spring WebFlux响应式数据访问Spring Data Reactive 概述 https://spring.io/reactive 2017 年&#xff0c;Spring 发布了新版本 Spring 5&#xff0c; Spring 5 引入了很多核心功能&#xff0c;这其中重要的就是全面拥抱了响应式编程的设计思想和实…...

网络设备的安全加固

设备的安全始终是信息网络安全的一个重要方面&#xff0c;攻击者往往通过控制网络中设备来破坏系统和信息&#xff0c;或扩大已有的破坏。网络设备包括主机&#xff08;服务器、工作站、PC&#xff09;和网络设施&#xff08;交换机、路由器等&#xff09;。 一般说来&#xff…...

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…...

Java高频面试之SE-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java缓冲区溢出&#xff0c;如何解决&#xff1f; 在 Java 中&#xff0c;缓冲区溢出 (Buffer Overflow) 虽然不是像 C/C 中那样直接可见…...

移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)

课程实践: (1)手写A*代码并且调试,总结优缺点 (2)基于Gazebo仿真,完成给定机器人在给定地图中的导航调试 (3)使用Groot设计自己的导航行为树 掌握一门技术 规划控制概述 常见移动机器人...

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++

#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }...

RTMP 和 WebRTC

WebRTC(Web Real-Time Communication)和 RTMP(Real-Time Messaging Protocol)是两种完全不同的流媒体协议,设计目标、协议栈、交互流程和应用场景均有显著差异。以下是两者的详细对比,涵盖协议字段、交互流程及核心设计思想。 一、协议栈与设计目标对比 特性RTMPWebRTC传…...

数据库技术基础

1 数据库系统概述 1.1 数据库的4个概念 &#xff08;1&#xff09;数据&#xff08;信息&#xff09; 数据&#xff1a;指已记录或可获取的事实&#xff0c;是数据库存储的最小单元。除文本、数字外&#xff0c;还有图形、图像、声音等。 数据由于能为用户利用才被记录和保…...

如何获取sql数据中时间的月份、年份(类型为date)

可用自带的函数month来实现 如&#xff1a; 创建表及插入数据&#xff1a; create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份&#xff1a; select MONTH(begindate)…...

每日Attention学习18——Grouped Attention Gate

模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…...

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解&#xff0c;欢迎大佬指出我文章的问题&#xff0c;一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表&#xff1f;k8s nodeport模式的原理&#xff1f; 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…...

TensorFlow是个啥玩意?

TensorFlow是一个开源的机器学习框架&#xff0c;由Google开发。它可以帮助开发者构建和训练各种机器学习模型&#xff0c;包括神经网络和深度学习模型。TensorFlow的设计理念是使用数据流图来表示计算过程&#xff0c;其中节点表示数学运算&#xff0c;边表示数据流动。 Tens…...

初识C语言、C语言的学习方向总述与入门

目录 1. 什么是C语言&#xff1f; 2. 第一个C语言程序 3. 数据类型 4. 变量、常量 4.1 定义变量的方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 5. 字符串转义字符注释 5.1 字符串 5.2 转义字符 6. 注释 7. 选择语句 8. 循环语句 …...

零基础学习书生.浦语大模型-入门岛

第一关&#xff1a;Linux基础知识 任务一&#xff1a;Cursor连接SSH运行代码 使用Remote - SSH插件即可 运行指令 python hello_world.py端口映射 ssh -p 46561 rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno 注&#xff1a;46561&a…...

【R语言】获取数据

R语言自带2种数据存储格式&#xff1a;*.RData和*.rds。 这两者的区别是&#xff1a;前者既可以存储数据&#xff0c;也可以存储当前工作空间中的所有变量&#xff0c;属于非标准化存储&#xff1b;后者仅用于存储单个R对象&#xff0c;且存储时可以创建标准化档案&#xff0c…...

MongoDB学习笔记-解析jsonCommand内容

如果需要屏蔽其他项目对MongoDB的直接访问操作&#xff0c;统一由一个入口访问操作MongoDB&#xff0c;可以考虑直接传入jsonCommand语句解析执行。 相关依赖包 <!-- SpringBootDataMongodb依赖包 --> <dependency><groupId>org.springframework.boot</…...

国产编辑器EverEdit - 工具栏说明

1 工具栏 1.1 应用场景 当用户想显示/隐藏界面的标签栏、工具栏、状态栏、主菜单等界面元素时&#xff0c;可以通过EverEdit的菜单选项进行设置。 1.2 使用方法 选择菜单查看 -> 工具栏&#xff0c;在工具栏的子菜单中选择勾选或去掉勾选对应的选项。 标签栏&#xff1…...

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...

制造业设备状态监控与生产优化实战:基于SQL的序列分析与状态机建模

目录 1. 背景与挑战 2. 数据建模与采集 2.1 数据表设计 设备状态表(记录设备实时状态变更)...

密码学的数学基础1-素数和RSA加密

数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff0…...