Java常见的23种设计模式
Java常见的23种设计模式
大家好,我是钢板兽!
本文将系统梳理 Java 的设计模式,涵盖创建型、结构型和行为型三大类,结合定义、原理、优点、应用场景、示例代码,帮助你初步了解常见的23种设计模式。
一、设计模式分类
根据模式的目的,Java 的设计模式被分为三大类:创建型模式、结构型模式和行为型模式。
- 创建型模式(Creational Patterns)目的是解决“对象如何创建”的问题,封装对象的创建逻辑,解耦使用者与构造细节。
- 结构型模式(Structural Patterns)目的是解决“类或对象之间如何组合”的问题,强调组合结构,提升系统的灵活性与可维护性。
- 行为型模式(Behavioral Patterns)目的是解决“对象之间如何交互”的问题,关注算法、职责、流程的封装与解耦。
二、创建型模式(5种)
1. 单例模式(Singleton)
- 定义: 保证一个类只有一个实例,并提供全局访问点。
- 原理: 构造函数私有化,使用静态变量存储实例,通过静态方法获取实例。
- 优点: 控制资源使用,防止多个实例导致冲突,线程安全。
- 应用场景: 日志工具类、线程池、配置中心、数据库连接池。
- 示例代码:
public class Singleton {private static volatile Singleton instance;// 私有构造函数,防止外部 newprivate Singleton() {}// 双重检查锁,确保线程安全且延迟加载public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
2. 工厂方法模式(Factory Method)
在Java中,工厂模式是一种广泛使用的设计模式,它属于创建型模式,旨在解决对象创建过程中的耦合问题,提高代码的复用性和扩展性。工厂模式通过定义一个共同的接口或抽象类来创建对象,客户端通过调用这个接口或抽象类来获取具体对象,而无需知道具体类的实现细节。工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
- 定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
- 原理: 抽象工厂接口 + 多个实现类封装创建逻辑。
- 优点: 解耦对象创建与使用,符合开闭原则,便于扩展。
- 应用场景: 日志框架 Appender、JDBC 中的 Connection 驱动。
- 示例代码:
// 产品接口
public interface Product {void use();
}// 具体产品类
public class ProductA implements Product {public void use() {System.out.println("使用产品 A");}
}// 工厂接口
public interface Factory {Product create();
}// 具体工厂类
public class FactoryA implements Factory {public Product create() {return new ProductA();}
}
3. 抽象工厂模式(Abstract Factory)
- 定义: 提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。
- 原理: 多个产品族的接口,多个工厂实现创建这些产品。
- 优点: 保证产品族的一致性,便于产品切换,隔离具体类。
- 应用场景: GUI 跨平台 UI 控件、数据库访问 API(切换数据库供应商)。
- 示例代码:
// 抽象产品接口
interface Button {void paint();
}// 具体产品
class WinButton implements Button {public void paint() { System.out.println("Windows 按钮"); }
}
class MacButton implements Button {public void paint() { System.out.println("Mac 按钮"); }
}// 抽象工厂
interface GUIFactory {Button createButton();
}// 具体工厂
class WinFactory implements GUIFactory {public Button createButton() { return new WinButton(); }
}
class MacFactory implements GUIFactory {public Button createButton() { return new MacButton(); }
}
关于工厂方法模式和抽象工厂模式的区别,工厂方法模式关注单个对象的创建,而抽象工厂模式关注一系列相关产品的创建。详解可以看这篇文章:https://blog.csdn.net/Liu_y_xin/article/details/140571412。
4. 原型模式(Prototype)
- 定义: 使用已有对象复制出新对象,而非 new。
- 原理: 对象实现
Cloneable
接口并重写clone()
方法。 - 优点: 避免重复构造,提升性能,便于复杂对象快速复制。
- 应用场景: 对象池、大量对象创建(如游戏角色、地图元素)。
- 示例代码:
public class Document implements Cloneable {private String content;public Document(String content) {this.content = content;}@Overridepublic Document clone() throws CloneNotSupportedException {return (Document) super.clone();}public String getContent() {return content;}
}
5. 建造者模式(Builder)
- 定义: 将一个复杂对象的构建与它的表示分离,使构建过程可独立于表示。
- 原理: 使用链式 API 封装每一步设置,最终构造完整对象。
- 优点: 创建过程清晰、灵活,适合构造具有多个参数的对象。
- 应用场景: HTTP 请求构造、复杂对象配置、SQL 语句拼装。
- 示例代码:
public class User {private String name;private int age;private String email;// 私有构造private User(Builder builder) {this.name = builder.name;this.age = builder.age;this.email = builder.email;}public static class Builder {private String name;private int age;private String email;public Builder setName(String name) {this.name = name; return this;}public Builder setAge(int age) {this.age = age; return this;}public Builder setEmail(String email) {this.email = email; return this;}public User build() {return new User(this);}}
}// 使用方式:
User user = new User.Builder().setName("Tom").setAge(30).setEmail("tom@example.com").build();
三、结构型模式
1. 适配器模式(Adapter Pattern)
- 定义: 将一个类的接口转换成客户端期望的另一个接口。
- 原理: 通过组合(对象适配)或继承(类适配)方式进行接口适配。
- 优点: 实现系统间的解耦,复用已有类。
- 应用场景: 接入第三方 SDK、老接口改造、新旧系统兼容。
- 示例代码:
interface Target {void request();
}class Adaptee {public void specificRequest() {System.out.println("Adaptee 原始方法");}
}class Adapter implements Target {private Adaptee adaptee = new Adaptee();public void request() {adaptee.specificRequest();}
}
2. 装饰器模式(Decorator Pattern)
- 定义: 动态地为对象添加额外功能,而不改变其结构。
- 原理: 使用组合方式包装原对象,并在方法中前后增强。
- 优点: 比继承更灵活,支持行为增强,符合开闭原则。
- 应用场景: Java IO、日志增强、权限控制。
- 示例代码:
interface Component {void operation();
}
class ConcreteComponent implements Component {public void operation() {System.out.println("基础操作");}
}
class Decorator implements Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {System.out.println("增强前");component.operation();System.out.println("增强后");}
}
3. 代理模式(Proxy Pattern)
- 定义: 为其他对象提供一种代理以控制对它的访问。
- 原理: 使用代理类包装目标对象,控制其访问逻辑。
- 优点: 增强目标对象功能,控制访问权限,支持懒加载等。
- 应用场景: AOP、RPC 框架、缓存代理、安全控制。
- 示例代码:
interface Subject {void request();
}
class RealSubject implements Subject {public void request() {System.out.println("真实请求");}
}
class ProxySubject implements Subject {private RealSubject realSubject = new RealSubject();public void request() {System.out.println("访问控制、权限校验");realSubject.request();}
}
4. 外观模式(Facade Pattern)
- 定义: 为子系统中的一组接口提供统一入口,简化使用。
- 原理: 封装复杂子系统的多个组件,统一暴露简单接口。
- 优点: 降低系统耦合、隐藏系统内部实现细节。
- 应用场景: Spring JdbcTemplate 封装 JDBC;系统集成平台。
- 示例代码:
class SubSystemA {void stepA() { System.out.println("步骤 A"); }
}
class SubSystemB {void stepB() { System.out.println("步骤 B"); }
}
class Facade {private SubSystemA a = new SubSystemA();private SubSystemB b = new SubSystemB();public void operate() {a.stepA();b.stepB();}
}
5. 桥接模式(Bridge Pattern)
- 定义: 将抽象与实现分离,使它们可以独立变化。
- 原理: 抽象类依赖于实现接口而不是具体实现,组合实现。
- 优点: 解耦抽象与实现,支持维度扩展。
- 应用场景: 不同设备和消息类型的组合场景。
- 示例代码:
// 发送消息的行为接口(实现部分的抽象),可以有多种实现方式,如邮件发送、短信发送等
interface MessageSender {void send(String msg);
}// 实现接口的具体类:邮件发送器
class EmailSender implements MessageSender {public void send(String msg) {System.out.println("发送邮件: " + msg);}
}// 抽象消息类(抽象部分的抽象),它持有一个 MessageSender 实例,桥接到发送实现部分
abstract class Message {protected MessageSender sender; // 实现部分的引用// 构造方法注入发送器实现(桥接实现)public Message(MessageSender sender) {this.sender = sender;}// 抽象方法:由具体子类实现具体的消息发送方式public abstract void sendMessage(String msg);
}// 扩展抽象类:文本消息,实际的业务逻辑放在这里,而非 EmailSender 中
class TextMessage extends Message {// 构造时指定使用的消息发送方式(如 EmailSender)public TextMessage(MessageSender sender) {super(sender);}// 实现抽象方法:发送文本消息,实质上调用的是桥接的 senderpublic void sendMessage(String msg) {sender.send(msg);}
}
6. 组合模式(Composite Pattern)
- 定义: 将对象组合成树形结构以表示部分-整体层次。
- 原理: 统一叶子节点与容器节点接口,递归处理结构。
- 优点: 客户端操作一致,支持递归遍历。
- 应用场景: 文件系统、组织架构树、菜单结构。
- 示例代码:
interface Component {void display();
}
class Leaf implements Component {private String name;public Leaf(String name) { this.name = name; }public void display() { System.out.println("叶子: " + name); }
}
class Composite implements Component {private List<Component> children = new ArrayList<>();private String name;public Composite(String name) { this.name = name; }public void add(Component c) { children.add(c); }public void display() {System.out.println("组合节点: " + name);for (Component c : children) c.display();}
}
7. 享元模式(Flyweight Pattern)
- 定义: 通过共享技术有效支持大量细粒度对象的复用。
- 原理: 分离内在状态(共享)与外在状态(调用时传入),使用工厂控制对象复用。
- 优点: 减少内存使用,提高系统性能。
- 应用场景: 字符串常量池、数据库连接池、线程池。
- 示例代码:
class Flyweight {private String intrinsic;public Flyweight(String intrinsic) {this.intrinsic = intrinsic;}public void operate(String extrinsic) {System.out.println("共享对象: " + intrinsic + ",外部状态: " + extrinsic);}
}
class FlyweightFactory {private static final Map<String, Flyweight> pool = new HashMap<>();public static Flyweight getFlyweight(String key) {return pool.computeIfAbsent(key, k -> new Flyweight(k));}
}
四、行为型模式
1. 策略模式(Strategy Pattern)
- 定义: 定义一系列算法,将每个算法封装起来,使它们可以互换。
- 原理: 将算法抽象为接口,运行时注入不同实现。
- 优点: 解耦算法选择逻辑,符合开闭原则。
- 应用场景: 支付策略、排序策略、日志策略。
- 示例代码:
// 抽象策略接口:定义统一的操作方法,所有具体策略类都需要实现这个接口
interface Strategy {int doOperation(int a, int b);
}// 具体策略类:加法实现
class Add implements Strategy {// 实现策略方法:执行加法运算public int doOperation(int a, int b) {return a + b;}
}// 上下文类:用于持有并调用某个策略对象
class Context {private Strategy strategy; // 当前使用的策略对象(即算法实现)// 构造方法注入策略,实现运行时策略切换public Context(Strategy strategy) {this.strategy = strategy;}// 执行策略封装的方法,具体行为由传入的策略对象决定public int execute(int a, int b) {return strategy.doOperation(a, b);}
}
使用示例:
public class Main {public static void main(String[] args) {Strategy addStrategy = new Add(); // 创建加法策略Context context = new Context(addStrategy); // 注入策略到上下文int result = context.execute(10, 5); // 执行策略方法System.out.println("结果:" + result); // 输出:结果:15}
}
2. 模板方法模式(Template Method)
- 定义: 定义一个操作中算法的骨架,将一些步骤延迟到子类中。
- 原理: 抽象类定义流程,子类实现具体步骤。
- 优点: 复用公共代码,子类灵活扩展部分行为。
- 应用场景: JDBC Template、测试框架。
- 示例代码:
abstract class AbstractClass {public final void execute() {step1(); step2();}protected abstract void step1();protected abstract void step2();
}
class SubClass extends AbstractClass {protected void step1() { System.out.println("步骤1"); }protected void step2() { System.out.println("步骤2"); }
}
3. 观察者模式(Observer)
- 定义: 当对象状态发生变化时,自动通知依赖它的对象。
- 原理: 被观察者维护观察者列表,状态变更时遍历调用。
- 优点: 实现一对多依赖,松耦合。
- 应用场景: 事件监听器、发布订阅系统。
- 示例代码:
interface Observer {void update(String msg);
}
class ConcreteObserver implements Observer {public void update(String msg) {System.out.println("收到消息: " + msg);}
}
class Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer o) { observers.add(o); }public void notifyAll(String msg) {for (Observer o : observers) o.update(msg);}
}
4. 责任链模式(Chain of Responsibility)
- 定义: 将请求沿处理者链传递,直到有对象处理它。
- 原理: 每个处理器包含对下一个处理器的引用。
- 优点: 请求发送者与接收者解耦。
- 应用场景: Servlet Filter、审批流。
- 示例代码:
// 抽象处理器类:定义责任链的基础结构
abstract class Handler {// 持有下一个处理器的引用,实现链式传递protected Handler next;// 设置下一个处理器(链条的连接点)public void setNext(Handler next) {this.next = next;}// 抽象处理方法,交由子类实现具体逻辑public abstract void handle(String request);
}// 具体处理器:进行权限校验处理
class AuthHandler extends Handler {@Overridepublic void handle(String request) {// 执行本处理器的逻辑:权限校验System.out.println("权限校验");// 如果有下一个处理器,则传递请求if (next != null) {next.handle(request);}}
}
5. 状态模式(State Pattern)
- 定义: 允许对象在状态变化时改变行为。
- 原理: 将状态封装成类,并在环境类中切换。
- 优点: 避免大量 if-else,提高状态切换可维护性。
- 应用场景: 工作流引擎、订单流程控制。
- 示例代码:
interface State {void handle();
}
class StartState implements State {public void handle() { System.out.println("开始状态"); }
}
class Context {private State state;public void setState(State state) { this.state = state; }public void request() { state.handle(); }
}
6. 命令模式(Command Pattern)
- 定义: 将请求封装成对象,支持参数化与撤销操作。
- 原理: 将调用者与执行者解耦,封装命令对象。
- 优点: 支持操作记录、撤销、事务。
- 应用场景: 操作日志、菜单命令、事务控制。
- 示例代码:
interface Command {void execute();
}
class Receiver {public void action() { System.out.println("执行操作"); }
}
class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver r) { this.receiver = r; }public void execute() { receiver.action(); }
}
7. 迭代器模式(Iterator Pattern)
- 定义: 提供一种顺序访问集合元素的方法。
- 原理: 将迭代逻辑与集合对象解耦。
- 优点: 简化集合遍历逻辑。
- 应用场景: Java 集合框架中的 Iterator。
- 示例代码:
Iterator<String> it = list.iterator();
while (it.hasNext()) {System.out.println(it.next());
}
8. 中介者模式(Mediator Pattern)
- 定义: 用中介对象封装对象交互,避免对象间过度耦合。
- 原理: 统一交互协调者,所有交互通过中介进行。
- 优点: 降低类之间的依赖,简化对象协作。
- 应用场景: GUI 控件交互、聊天系统。
- 示例代码:
interface Mediator {void notify(String event);
}
class Button {private Mediator mediator;public Button(Mediator m) { this.mediator = m; }public void click() { mediator.notify("click"); }
}
9. 备忘录模式(Memento Pattern)
- 定义: 保存对象的内部状态,以便恢复。
- 原理: 状态快照保存于 Memento 对象中。
- 优点: 实现撤销回滚,不破坏封装。
- 应用场景: 编辑器撤销、事务恢复。
- 示例代码:
class Memento {private String state;public Memento(String state) { this.state = state; }public String getState() { return state; }
}
class Originator {private String state;public void setState(String state) { this.state = state; }public Memento save() { return new Memento(state); }public void restore(Memento m) { state = m.getState(); }
}
10. 解释器模式(Interpreter Pattern)
- 定义: 定义语言的文法,并构建解释器解释语句。
- 原理: 使用抽象语法树(AST)递归解释结构。
- 优点: 可扩展语言规则,易于实现 DSL。
- 应用场景: 表达式求值器、SQL解析器。
- 示例代码:
interface Expression {int interpret();
}
class Number implements Expression {private int value;public Number(int value) { this.value = value; }public int interpret() { return value; }
}
11. 访问者模式(Visitor Pattern)
- 定义: 在不修改对象结构的前提下定义新的操作。
- 原理: 将操作抽离成访问者类,由元素结构接纳执行。
- 优点: 增加新操作易于扩展,符合开闭原则。
- 应用场景: 编译器 AST、对象结构分析。
- 示例代码:
interface Visitor {void visit(ElementA e);
}
interface Element {void accept(Visitor v);
}
class ElementA implements Element {public void accept(Visitor v) { v.visit(this); }
}
。
- 优点: 可扩展语言规则,易于实现 DSL。
- 应用场景: 表达式求值器、SQL解析器。
- 示例代码:
interface Expression {int interpret();
}
class Number implements Expression {private int value;public Number(int value) { this.value = value; }public int interpret() { return value; }
}
11. 访问者模式(Visitor Pattern)
- 定义: 在不修改对象结构的前提下定义新的操作。
- 原理: 将操作抽离成访问者类,由元素结构接纳执行。
- 优点: 增加新操作易于扩展,符合开闭原则。
- 应用场景: 编译器 AST、对象结构分析。
- 示例代码:
interface Visitor {void visit(ElementA e);
}
interface Element {void accept(Visitor v);
}
class ElementA implements Element {public void accept(Visitor v) { v.visit(this); }
}
相关文章:
Java常见的23种设计模式
Java常见的23种设计模式 大家好,我是钢板兽! 本文将系统梳理 Java 的设计模式,涵盖创建型、结构型和行为型三大类,结合定义、原理、优点、应用场景、示例代码,帮助你初步了解常见的23种设计模式。 一、设计模式分类…...
兔单B细胞单抗制备服务
1.兔单B细胞技术原理 兔单B细胞技术是近年来新发展的一类快速制备单克隆抗体的技术,是一种通过分离和单克隆化兔子体内的B细胞来制备单一来源的高特异性抗体的方法。基于流式细胞分选技术进行单B细胞单抗制备,利用每个B细胞只含有一个功能性重链可变区D…...
MySQL基础 [六] - 内置函数+复合查询+表的内连和外连
内置函数一般要用select调用 内置函数 日期函数 current_date函数 current_date函数用于获取当前的日期。如下: current_time函数 current_time函数用于获取当前的时间。如下: now函数 now函数用于获取当前的日期时间。如下: date函数 dat…...
nginx路径匹配的优先级
在 Nginx 配置中,当请求 /portal/agent/sse 时,会匹配 location ~* /sse$ 规则,而不是 location /portal。原因如下: 匹配规则解析 location ~* /sse$ ~* 表示 不区分大小写的正则匹配/sse$ 表示以 /sse 结尾的路径匹配结果&#…...
tcp/ip攻击及防范
作为高防工程师,我每天拦截数以万计的恶意流量,其中TCP/IP协议层攻击是最隐蔽、最具破坏性的威胁之一。常见的攻击手法包括: 1. SYN Flood攻击:攻击者发送大量伪造的SYN包,耗尽服务器连接资源,导致正常用…...
2025年3月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析
更多真题在线练习系统:历年真题在线练习系统 一、单选题 1、下列哪个软件不能运行 Python 程序?( ) A、JupyterNotebook B、Pycharm C、原版的Scratch D、IDLE 正确答案:C 答案解析:本题考察的 Pyt…...
TreeMap 核心知识点与面试题解析
TreeMap 核心知识点与面试题解析 一、TreeMap 基础概念 TreeMap 是 Java 集合框架中基于 红黑树(Red-Black Tree) 实现的 Map,具有以下特点: 有序性:默认按 key 的自然顺序(Comparable)或自定…...
深入理解 DevOps 与 CI/CD:概念、流程及优势
在当今快速发展的数字化时代,软件开发和交付的速度与质量成为企业在激烈竞争中脱颖而出的关键因素。DevOps 和 CI/CD 作为现代软件开发领域的重要理念和实践,正深刻地改变着软件开发生命周期的运作方式。本文将深入探讨 DevOps 的概念,详细解析 CI/CD 的内涵、管道阶段以及实…...
Flutter BloC 架构入门指南
BLoC (Business Logic Component) 是 Flutter 中一种流行的状态管理架构,它可以帮助你将业务逻辑与 UI 分离,使代码更清晰、可测试性更强。 核心概念 1. BloC 的核心组件 Events:用户交互或系统事件(如按钮点击、网络请求完成&…...
OpenHarmony-AI调研
OpenHarmony-AI调研 文章目录 OpenHarmony-AI调研前言一、当前版本部署组件二、AI架构1.mindspore-lite2.ai_engine3.neural_network_runtime4.intelligent_voice_framework5.HDI驱动 三、应用1.命令行以及web运行deepseek-r12.与deepseek通过语音进行交互3.物品识别4.人脸识别…...
zk基础—zk实现分布式功能
1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式:服务端主动将更新的数据发送给所有订阅的客户端。 拉模式:客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…...
Tips:用proxy解决前后端分离项目中的跨域问题
在前后端分离项目中,"跨域问题"是浏览器基于同源策略(Same-Origin Policy)对跨域请求的安全限制。当你的前端(如运行在 http://localhost:3000 )和后端(如运行在 http://localhost:8080 &#…...
JMeterPlugins-Standard-1.4.0 插件详解:安装、功能与使用指南
JMeterPlugins-Standard-1.4.0 是 Apache JMeter(一款流行的开源负载和性能测试工具)的插件包,它扩展了 JMeter 的功能,提供了更多监听器(Listeners)、采样器(Samplers)和辅助组件&a…...
JMeter 中,Token 和 Cookie 的区别及实际应用
在 JMeter 中,Token 和 Cookie 都是用于处理用户会话和身份验证的机制,但它们的 工作原理、存储方式 和 应用场景 有显著区别。以下是详细对比和实际应用指南: 1. 核心区别 特性Token (如 JWT、OAuth)Cookie存储位置通常存储在 HTTP 请求头(如 Authorization: Bearer <t…...
蓝桥杯真题——好数、R格式
目录 蓝桥杯2024年第十五届省赛真题-好数 【模拟题】 题目描述 输入格式 输出格式 样例输入 样例输出 提示 代码1:有两个案例过不了,超时 蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】 题目描述 输入格式 输出格式 样例输入…...
JavaScript惰性加载优化实例
这是之前的一位朋友的酒桌之谈,他之前负责的一个电商项目,刚刚开发万,首页加载时间特别长,体验很差,所以就开始排查,发现是在首页一次性加载所有js导致的问题,这个问题在自己学习的时候并不明显…...
0_Pytorch中的张量操作
[引言]张量的概念 1.基本概念 张量是一个通用的多维数组,可以表示标量(0 维)、向量(1 维)、矩阵(2 维)以及更高维度的数据。张量是 PyTorch 中的核心数据结构,用于表示和操作数据。…...
Java面试43-常见的限流算法有哪些?
限流算法是一种系统保护策略,主要是避免在流量高峰导致系统被压垮,造成系统不可用的问题。 常见的限流算法有五种: 计数器限流,一般用在单一维度的访问频率限制上,比如短信验证码每隔60s只能发送一次,或者…...
牛客网:树的高度 ← 根节点为 0 号节点
【题目来源】 https://www.nowcoder.com/questionTerminal/4faa2d4849fa4627aa6d32a2e50b5b25 【题目描述】 现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度。 【输入格式】 输入的第一行表…...
Linux:进程程序替换execl
目录 引言 1.单进程版程序替换 2.程序替换原理 3.6种替换函数介绍 3.1 函数返回值 3.2 命名理解 3.3 环境变量参数 引言 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),我们所创建的所有的子进程,执行的代码&#x…...
⑩数据中心M-LAG 实战
一、配置指导自己去看今天操作的是M-LAG 基础实验 二、配置代码信息回顾 ### 1、配置 M-LAG 系统 MAC 地址<H3C>system-view[H3C]m-lag system-mac ?H-H-H MAC address2a7a-53ee-0100 Bridge MAC address[H3C]m-lag system-mac### 2、配置 M-LAG 系统编号…...
delphi idtcpserver 搭建tcp ,ssl协议服务端
如果想用indy idtcpserver实现tcp ssl,那么正是你需要的 首先生成证书: 2、windows生成pem证书 - 站着说话不腰疼 - 博客园 有证书后 idtcpserver 用的三个证书, IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile = ca.crt IdServerIOHandlerSSLOpenSSL1.SSLOptions.…...
如何实现外观模式?
一、模式理解(用快递驿站比喻) 想象你网购了5件商品,分别来自不同快递公司。 外观模式就像小区门口的快递驿站,你不需要知道中通怎么分拣、顺丰怎么运输,只要到驿站报取件码就能拿到所有包裹。 在前端开发中…...
深入解析 Linux 文件系统权限:从基础到高级实践
引言 在 Linux 系统中,文件系统权限是保障数据安全和多用户协作的核心机制。想象这样一个场景: 你的服务器上有多个团队共享项目文件 财务数据必须严格保密,仅允许指定人员访问 开发团队需要共同编辑代码,但禁止随意删除他人文…...
GZ036区块链卷一 EtherStore合约漏洞详解
题目 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function withdraw() public {uint bal balances[msg.sender…...
医药流通行业批发公司IT运维转型:Prometheus+Grafana监控Spring Boot 3应用实践
一、引言:医药流通行业IT运维挑战与工具换代需求 在医药流通行业批发领域,业务的核心在于供应链的高效运转、订单处理的精准及时以及库存管理的动态平衡。随着互联网医疗的兴起和电商平台的渗透,传统医药批发企业正加速向数字化、智能化转型…...
编程助手fitten code使用说明(超详细)(vscode)
这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方,无论是快速修复错误、提升代…...
金融大模型
FinGPT 数据集:https://github.com/AI4Finance-Foundation/FinGPT/tree/master/fingpt/FinGPT-v3 FinGPT v3 系列是在新闻和微博情绪分析数据集上使用 LoRA 方法进行微调的LLM,在大多数金融情绪分析数据集上取得了最佳分数。 FinGPT v3.1 使用 chatgl…...
【Pandas】pandas DataFrame infer_objects
Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...
011_异常、泛型和集合框架
异常、泛型和集合框架 异常Java的异常体系异常的作用 自定义异常异常的处理方案异常的两种处理方式 泛型泛型类泛型接口泛型方法、通配符和上下限泛型支持的类型 集合框架集合体系结构Collection Collection集合Collection的遍历方式认识并发修改异常问题解决并发修改异常问题的…...
QTSql全解析:从连接到查询的数据库集成指南
概览 与数据库的有效集成是确保数据管理效率和应用性能的关键,Qt框架就提供了强大的QtSql模块,使得开发者能够轻松地进行数据库操作,包括连接、查询执行以及结果处理等 一、引入QtSql模块 首先,需要在项目中引入QtSql模块&…...
docker快捷打包脚本(ai版)
直接进入主题: 用这个脚本前提是你本地可以拉镜像仓库的镜像,并且在 本地有了,然后将所有的镜像tag写在一个文件中,和下面docker_tags.txt 对应,文件叫什么,脚本里对应改什么,给小白说的 #!/bi…...
分布式防护节点秒级切换:实战配置与自动化运维
摘要:针对DDoS攻击导致节点瘫痪的问题,本文基于群联AI云防护的智能调度系统,详解如何实现节点健康检查、秒级切换与自动化容灾,并提供Ansible部署脚本。 一、分布式节点的核心价值 资源分散:攻击者难以同时击溃所有节…...
TBE(TVM的扩展)
算子 张量 一个张量只有一种数据类型 在内存中只能线性存储,最终形成一个长的一维数组 晟腾AI的数据格式 AIPP是对我们常见的数据格式转化成AI core支持的数据格式 广播机制 TVM TBE的第一种开发方式:DSL TBE的第二种开发方式:TVM TBE的第…...
Jenkins配置的JDK,Maven和Git
1. 前置 在配置前,我们需要先把JDK,Maven和Git安装到Jenkins的服务器上。 (1)需要进入容器内部,执行命令:docker exec -u root -it 容器号/容器名称(2选1) bash -- 容器名称 dock…...
核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室
核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室 为满足当今无人机行业应用需求,推动无人机技术的教育与实践深度融合,北京卓翼智能科技有限公司旗下品牌飞思实验室与湖南汽车工程职业大学强强联手,共同建设无人机操控与编队技术…...
【阻抗匹配】
自动匹配的实现: 检测反射信号:通过传感器(如定向耦合器)监测反射功率或驻波比(SWR),判断是否失配。控制单元:利用微控制器或专用芯片(如FPGA)分析检测数据&a…...
micro常用快捷键
micro常用快捷键 以下是 micro 编辑器 的常用快捷键整理,按功能分类清晰,方便快速查阅: 1. 基础操作 快捷键功能Ctrl S保存文件Ctrl Q退出编辑器Ctrl O打开文件Ctrl E打开命令栏(输入命令)Ctr…...
DNS域名解析服务
目录 DNS系统 DNS系统的作用 DNS系统的类型(服务器分类) 1. 递归解析器(Recursive Resolver) 2. 根域名服务器(Root Name Server) 3. 顶级域服务器(TLD Name Server)…...
Linux的目录结构
倒根树状结构 【注意】 / 表示根目录,相当于Windows的C盘 进入跟目录命令: cd / /bin:存放的系统命令或二进制文件,如:cd ls cp等 /sbin /usr/bin /dev:存放的设备节点文件 , 驱动文件 /…...
【Python】Python 100题 分类入门练习题 - 新手友好
Python 100题 分类入门练习题 - 新手友好篇 - 整合篇 一、数学问题题目1:组合数字题目2:利润计算题目3:完全平方数题目4:日期天数计算题目11:兔子繁殖问题题目18:数列求和题目19:完数判断题目21…...
Three.js 系列专题 7:性能优化与最佳实践
内容概述 随着 3D 场景复杂度的增加,性能优化变得至关重要。Three.js 项目可能因几何体数量、纹理大小或渲染设置而变慢。本专题将介绍减少 draw call、优化纹理和使用调试工具的最佳实践。 学习目标 学会减少 draw call 和几何体复杂度。掌握纹理压缩与内存管理。使用 Stat…...
特权FPGA之Johnson移位
完整代码: module johnson(clk,rst_n,led,sw1_n,sw2_n,sw3_n);input clk; //时钟信号,50MHz input rst_n; //复位信号,低电平有效 output[3:0] led; //LED控制,1--灭…...
聊聊 CSS
先补充一些概念 C/S(客户端/服务器):要下载到本地才能用 需要安装、偶尔更新、不跨平台 B/S(浏览器/服务器):在浏览器输入网址就可以使用 无需安装、无需更新、可跨平台 [!NOTE] B/S 架构优点如此之多&am…...
域名系统DNS
一 概述 域名系统DNS是互联网使用的命名系统,用来把便于人们使用的机器名称转换为IP地址,比如我们熟知的www.baidu.com,www.sina.com,这些域名的背后都对应着一个又一个的IP地址。由域名转换为IP的过程我们称为解析,解析的过程大…...
大模型ui设计SVG输出
你是一位资深 SVG 绘画设计师,现需根据以下产品需求创建SVG方案: 产品需求 约拍app 画板尺寸: 宽度:375px(基于提供的HTML移动设计)高度:812px(iPhone X/XS 尺寸) 配…...
利用securecrt的tftp服务器功能传递文件
日常经常能用到需要调测一些openwrt设备,要互相拷贝文件,没有开启ftp功能时,这时可以用到crt的tftp内置服务器功能,利用tftp功能传递文件。 配置方法: 打开设置→全局配置→终端→tftp配置设置c上内置tftp服务器时&a…...
基于STM32、HAL库的IP2736U快充协议芯片简介及驱动程序设计
一、简介: IP2736U是一款高性能的USB Type-C和Power Delivery(PD)控制器芯片,支持最新的USB PD 3.0规范。它具有以下特点: 支持USB Type-C和PD 3.0协议 内置MCU,可编程配置 支持多种供电角色(Source/Sink/DRP) 支持PPS可编程电源 支持多种快充协议(PD/QC/AFC/FCP/SCP等) I…...
SQL学习笔记七
第九章用正则表达式进行搜索 9.1正则表达式介绍 正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以 使用一个正则表达式…...
MicroPython 开发ESP32应用教程 之 Timer、GPIO中断
随着我们课程的递进,大家会发现,我们之前课程中的例子,虽然功能都能实现,但总觉得体验感不够好,比如按键控制GRB灯珠的时候,很容易出现按键后,灯珠没有反应,还有蓝牙发送指令控制灯珠…...