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

泛型设计模式实践

学海无涯,志当存远。燃心砺志,奋进不辍。

愿诸君得此鸡汤,如沐春风,事业有成。

若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!

为解决在设计框架或库时遇到的类型安全问题,或者处理多态集合时的挑战。
希望优化代码结构,减少重复,提高类型安全。
需要结合常见的设计模式,比如工厂模式、策略模式等,展示泛型如何在这些模式中发挥作用。常见的泛型设计模式,比如类型安全的异构容器、泛型单例工厂、策略模式中的泛型应用,以及构建器模式。
需要具体说明每个模式的应用场景、实现方式和优势。
例如,类型安全的异构容器使用Class对象作为键,存储不同类型的实例,
这样可以在编译时保证类型安全,避免运行时错误。痛点难点,比如处理不同类型数据时的强制转换,或者如何避免使用Object类型带来的类型不安全。
此时,展示如何通过泛型消除显式转换,提升代码的可读性和安全性。
例如,使用泛型方法替代重载,减少代码重复。桥接方法在类型擦除中的作用,以及如何利用反射获取泛型信息,
比如通过ParameterizedType来动态获取类型参数。
但要注意反射的使用场景和限制,比如类型擦除后的信息保留情况。实际项目中应用这些设计模式,结合相应的代码示例,并解释每个步骤的设计考虑。
比如,在工厂模式中使用泛型创建不同产品类型的实例,避免多个工厂类的问题。
或者,在策略模式中使用泛型接口,使策略实现能够处理不同类型的数据。潜在的问题和最佳实践,比如避免过度使用泛型导致代码复杂化,或者如何处理类型擦除带来的限制。
例如,在创建泛型数组时,使用通配符类型或@SuppressWarnings注解,并解释为何需要谨慎处理。最后,总结这些设计模式如何综合提升代码的灵活性和可维护性,强调类型安全的重要性,
以及在维护和扩展代码时的便利。

目录

一、类型安全的异构容器(Type-Safe Heterogeneous Container)

二、泛型工厂模式(Generic Factory)

三、策略模式 + 泛型(Generic Strategy)

四、构建器模式 + 泛型(Generic Builder)

五、模板方法模式 + 泛型(Generic Template Method)

六、责任链模式 + 泛型

七、观察者模式 + 泛型

八、应用建议

1.类型边界明确化 :始终为泛型参数定义明确的边界

2.避免类型擦除问题 :在需要保留类型信息时使用Class对象

3.合理使用通配符 :提高API灵活性

总结:泛型设计模式的核心价值


在Java开发中,结合泛型与设计模式可以显著提升代码的类型安全性复用性可维护性。以下是几种典型的泛型设计模式实践,通过具体场景说明其优势:


一、类型安全的异构容器(Type-Safe Heterogeneous Container)

场景:需要在一个容器中存储和获取不同类型的对象,同时保证类型安全
实现:使用Class<T>对象作为键,动态关联类型与值。

public class TypeSafeContainer {private Map<Class<?>, Object> container = new HashMap<>();public <T> void put(Class<T> type, T instance) {container.put(type, instance);}public <T> T get(Class<T> type) {return type.cast(container.get(type));}// 使用示例public static void main(String[] args) {TypeSafeContainer container = new TypeSafeContainer();container.put(String.class, "Hello");container.put(Integer.class, 42);String str = container.get(String.class);  // 无需强制转换Integer num = container.get(Integer.class); // 类型安全}
}

优势

  • 避免使用Object类型和强制转换,消除ClassCastException风险。

  • 通过Class<T>类型检查确保键值对类型一致性。


二、泛型工厂模式(Generic Factory)

场景:创建不同类型对象时,避免为每个类型编写重复的工厂类。
实现:通过泛型接口统一工厂方法,结合反射动态实例化对象

public interface GenericFactory<T> {T create();
}// 实现通用工厂(基于反射)
public class ReflectionFactory<T> implements GenericFactory<T> {private Class<T> type;public ReflectionFactory(Class<T> type) {this.type = type;}@Overridepublic T create() {try {return type.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException(e);}}
}// 使用示例
public class Main {public static void main(String[] args) {GenericFactory<String> stringFactory = new ReflectionFactory<>(String.class);String str = stringFactory.create();  // 创建空字符串GenericFactory<ArrayList<?>> listFactory = new ReflectionFactory<>(ArrayList.class);ArrayList<?> list = listFactory.create(); // 创建空列表}
}
public interface GenericFactory<T> {T create();
}// 具体产品工厂实现
public class ProductFactory<T extends Product> implements GenericFactory<T> {private Class<T> productClass;public ProductFactory(Class<T> productClass) {this.productClass = productClass;}@Overridepublic T create() {try {return productClass.newInstance();} catch (Exception e) {throw new RuntimeException("创建产品失败", e);}}
}

优势

  • 一个工厂类支持所有类型,减少代码冗余。

  • 通过类型参数约束,确保工厂产出对象类型正确。


三、策略模式 + 泛型(Generic Strategy)

场景:定义可复用的算法策略,支持不同类型数据的处理逻辑。
实现:泛型接口声明策略,具体实现类处理特定类型。

// 策略接口(泛型化)
public interface ValidationStrategy<T> {boolean validate(T data);
}// 具体策略:校验字符串非空
public class StringNonEmptyStrategy implements ValidationStrategy<String> {@Overridepublic boolean validate(String data) {return data != null && !data.isEmpty();}
}// 具体策略:校验数值范围
public class NumberRangeStrategy implements ValidationStrategy<Integer> {private final int min;private final int max;public NumberRangeStrategy(int min, int max) {this.min = min;this.max = max;}@Overridepublic boolean validate(Integer data) {return data >= min && data <= max;}
}// 使用示例
public class Validator {public static <T> boolean validate(T data, ValidationStrategy<T> strategy) {return strategy.validate(data);}public static void main(String[] args) {boolean isValidString = validate("test", new StringNonEmptyStrategy()); // trueboolean isValidNumber = validate(15, new NumberRangeStrategy(10, 20)); // true}
}
public interface PricingStrategy<T extends Product> {BigDecimal calculatePrice(T product, int quantity);
}// 具体策略实现
public class DiscountPricingStrategy<T extends DiscountableProduct> implements PricingStrategy<T> {@Overridepublic BigDecimal calculatePrice(T product, int quantity) {return product.getOriginalPrice().multiply(product.getDiscountRate()).multiply(new BigDecimal(quantity));}
}

优势

  • 策略逻辑与数据类型解耦,可复用性强

  • 编译器检查策略与数据类型的匹配,避免运行时错误。


四、构建器模式 + 泛型(Generic Builder)

场景:构建复杂对象时,支持链式调用和类型安全的属性赋值
实现:使用泛型递归定义构建器,确保方法链的连贯性。

public abstract class Animal {private final String name;private final int age;protected Animal(Builder<?> builder) {this.name = builder.name;this.age = builder.age;}// 泛型构建器(递归类型定义)public abstract static class Builder<T extends Builder<T>> {private String name;private int age;public T name(String name) {this.name = name;return self();}public T age(int age) {this.age = age;return self();}abstract Animal build();protected abstract T self(); // 返回当前构建器实例}
}// 具体子类:Dog
public class Dog extends Animal {private final String breed;private Dog(DogBuilder builder) {super(builder);this.breed = builder.breed;}// 具体构建器public static class DogBuilder extends Builder<DogBuilder> {private String breed;public DogBuilder breed(String breed) {this.breed = breed;return this;}@Overridepublic Dog build() {return new Dog(this);}@Overrideprotected DogBuilder self() {return this;}}
}// 使用示例
Dog dog = new Dog.DogBuilder().name("Buddy").age(3).breed("Golden Retriever").build();
public class ProductBuilder<T extends Product> {private T product;public ProductBuilder(Supplier<T> supplier) {this.product = supplier.get();}public ProductBuilder<T> withName(String name) {product.setName(name);return this;}public ProductBuilder<T> withPrice(BigDecimal price) {product.setPrice(price);return this;}public T build() {return product;}
}

优势

  • 链式调用语法清晰,IDE自动补全支持良好。

  • 子类构建器方法返回具体类型,避免类型转换。


五、模板方法模式 + 泛型(Generic Template Method)

场景:定义算法骨架,允许子类实现特定步骤,同时支持不同类型的数据处理。
实现:抽象类使用泛型定义算法流程,子类指定具体类型。

public abstract class DataProcessor<T> {// 模板方法(算法骨架)public final void process() {T data = loadData();validate(data);transform(data);save(data);}protected abstract T loadData();protected abstract void validate(T data);protected abstract void transform(T data);protected abstract void save(T data);
}// 具体实现:处理CSV数据
public class CsvProcessor extends DataProcessor<List<String[]>> {@Overrideprotected List<String[]> loadData() {// 从文件加载CSV数据return Arrays.asList(new String[]{"Alice", "30"}, new String[]{"Bob", "25"});}@Overrideprotected void validate(List<String[]> data) {data.forEach(row -> {if (row.length != 2) throw new IllegalArgumentException("Invalid CSV format");});}@Overrideprotected void transform(List<String[]> data) {data.replaceAll(row -> new String[]{row[0].toUpperCase(), row[1]});}@Overrideprotected void save(List<String[]> data) {System.out.println("Saving processed CSV: " + data);}
}
public abstract class DataProcessor<T, R> {public final R process(T input) {validate(input);R result = doProcess(input);postProcess(result);return result;}protected abstract R doProcess(T input);protected void validate(T input) {// 默认验证逻辑}protected void postProcess(R result) {// 默认后处理逻辑}
}

优势

  • 复用算法流程,子类只需关注具体类型逻辑。

  • 类型参数明确每个步骤的数据类型,减少错误。


六、责任链模式 + 泛型

线性处理流程

场景:- 电商订单处理流程 :订单验证→库存检查→支付处理→物流分配
           - 审批工作流 :不同级别的审批人处理不同类型的申请
           - 数据处理管道 :数据清洗→转换→验证→持久化
实现:定义抽象类中下一次调用参数next, 调用时实现链路调用

// 基础订单处理器
public abstract class OrderProcessor<T extends Order> {private OrderProcessor<T> next;public OrderProcessor<T> linkWith(OrderProcessor<T> next) {this.next = next;return next;}public abstract boolean process(T order);protected boolean processNext(T order) {return next == null ? true : next.process(order);}
}// 具体处理器实现
public class InventoryChecker extends OrderProcessor<PurchaseOrder> {@Overridepublic boolean process(PurchaseOrder order) {if (!checkInventory(order)) {return false;}return processNext(order);}private boolean checkInventory(PurchaseOrder order) {// 库存检查逻辑}
}
public interface OrderHandler<T extends Order> {void handle(T order);void setNext(OrderHandler<T> next);
}// 基础抽象类
public abstract class AbstractOrderHandler<T extends Order> implements OrderHandler<T> {private OrderHandler<T> next;@Overridepublic void setNext(OrderHandler<T> next) {this.next = next;}protected void handleNext(T order) {if (next != null) {next.handle(order);}}
}
// 电商订单处理系统(责任链)
// 构建处理链
OrderProcessor<Order> processorChain = new OrderValidator().linkWith(new PaymentProcessor()).linkWith(new ShippingProcessor());// 处理订单
processorChain.process(order);

优势

  • 类型安全 :确保每个处理器只处理特定类型的订单

  • 灵活扩展 :可动态添加新的处理器而不影响现有逻辑

  • 解耦 :每个处理器只需关注自己的职责范围

注意:处理链中所有处理器类型一致、链长度影响性能、单向传递


七、观察者模式 + 泛型

事件通知场景

场景:- 电商事件通知 :订单状态变更、库存预警、支付成功等事件
           - 用户行为追踪 :记录用户浏览、点击、购买等行为
           - 系统监控 :CPU使用率、内存占用等指标变化通知
实现:抽象类使用泛型定义算法流程,子类指定具体类型。 

public class GenericEventBus<T> {private Map<Class<? extends T>, List<Consumer<? extends T>>> listeners = new ConcurrentHashMap<>();public <E extends T> void subscribe(Class<E> eventType, Consumer<E> listener) {listeners.computeIfAbsent(eventType, k -> new ArrayList<>()).add(listener);}@SuppressWarnings("unchecked")public <E extends T> void publish(E event) {List<Consumer<? extends T>> eventListeners = listeners.get(event.getClass());if (eventListeners != null) {eventListeners.forEach(listener -> ((Consumer<E>) listener).accept(event));}}
}// 事件定义
public class OrderEvent {private String orderId;// 其他字段...
}
public class EventPublisher<T> {private List<Consumer<T>> listeners = new ArrayList<>();public void subscribe(Consumer<T> listener) {listeners.add(listener);}public void publish(T event) {listeners.forEach(listener -> listener.accept(event));}
}
//  库存预警系统(观察者)
// 创建事件总线
GenericEventBus<InventoryEvent> eventBus = new GenericEventBus<>();// 订阅事件
eventBus.subscribe(LowStockEvent.class, event -> {// 发送预警邮件emailService.sendLowStockAlert(event.getProductId());
});// 发布事件
eventBus.publish(new LowStockEvent(productId, currentStock));

优势

  • 类型精确匹配 :订阅者只会收到其订阅的特定类型事件

  • 性能优化 :通过事件类型分类,减少不必要的通知

  • 编译时检查 :避免运行时类型转换错误

  • 多事件类型支持 :一个事件总线可处理多种相关事件类型

注意:订阅者数量影响性能、可处理多种相关事件类型、发布者无法控制订阅者执行、一对多广播


八、应用建议

1.类型边界明确化 :始终为泛型参数定义明确的边界
public class UserService<T extends User & Serializable> {// 同时继承User和实现Serializable
}

2.避免类型擦除问题 :在需要保留类型信息时使用Class对象
public class JpaRepository<T, ID> {private Class<T> entityClass;public JpaRepository(Class<T> entityClass) {this.entityClass = entityClass;}
}

3.合理使用通配符 :提高API灵活性
public static void copy(List<? extends Product> src, List<? super Product> dest) {dest.addAll(src);
}

总结:泛型设计模式的核心价值

  1. 类型安全:编译器检查类型匹配,减少运行时错误。

  2. 代码复用:通过泛型抽象通用逻辑,避免重复代码。

  3. 可扩展性:新增类型时只需扩展泛型类/接口,无需修改核心逻辑。

  4. 清晰表达意图:泛型类型参数明确代码设计目的,提升可读性。

通过将泛型与设计模式结合,可以创建出既灵活又类型安全的代码结构,显著提升代码的可维护性和可扩展性。每种模式都通过泛型增强了其适用场景,使代码更加通用而不失类型安全.

在实际项目中,应根据场景选择合适模式,避免过度泛型化导致代码复杂度上升。结合Optional<T>Stream API等特性,可进一步构建灵活且健壮的Java应用。

学海无涯,志当存远。燃心砺志,奋进不辍。

愿诸君得此鸡汤,如沐春风,事业有成。

若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!

相关文章:

泛型设计模式实践

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 为解决在设计框架或库时遇到的类型安全问题&#xff…...

java的输入输出模板(ACM模式)

文章目录 1、前置准备2、普通输入输出API①、输入API②、输出API 3、快速输入输出API①、BufferedReader②、BufferedWriter 案例题目描述代码 面试有时候要acm模式&#xff0c;刷惯leetcode可能会手生不会acm模式&#xff0c;该文直接通过几个题来熟悉java的输入输出模板&…...

鸿蒙 所有API缩略图鉴

从HarmonyOS NEXT Developer Preview1&#xff08;API 11&#xff09;版本开始&#xff0c;HarmonyOS SDK以 Kit 维度提供丰富、完备的开放能力&#xff0c;涵盖应用框架、应用服务、系统、媒体、AI、图形在内的六大领域&#xff0c;共计30000个API...

【LangChain全景指南】构建下一代AI应用的开发框架

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a7; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f9e9; 关键技术模块说明⚖️ 技术选…...

垃圾对象回收

1.如何判断对象可以被回收 对象是否可以被回收通常由垃圾回收器决定。 垃圾回收器使用一种称为"可达性分析"的算法来确定对象是否可被回收。 可达性分析是指如果一个对象无法从任何GCRoots直接或间接访问到&#xff0c;它就被认为是不可达的&#xff0c;可以被垃圾回…...

【Docker系列】使用格式化输出与排序技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

nvme Unable to change power state from D3cold to D0, device inaccessible

有个thinkpad l15 gen4笔记本&#xff0c;使用较少&#xff0c;有一块三星m2和东芝14t硬盘&#xff0c;想安装飞牛nas系统作为家庭照片库&#xff0c;制作飞牛启动盘&#xff0c;发现安装飞牛需要全盘格式化&#xff0c;电脑本身的系统还是需要保留的&#xff0c;故想到再安装一…...

基础语法(二)

Mysql基础语法&#xff08;二&#xff09; Mysql基础语法&#xff08;二&#xff09;主要介绍Mysql中稍微进阶一点的内容&#xff0c;会稍微有一些难度&#xff08;博主个人认为&#xff09;。学习完基础语法&#xff08;一&#xff09;和基础语法&#xff08;二&#xff09;之…...

AcWing 877:扩展欧几里得算法

【题目来源】 https://www.acwing.com/problem/content/879/ 【题目描述】 给定 n 对正整数 ai,bi&#xff0c;对于每对数&#xff0c;求出一组 xi,yi&#xff0c;使其满足 aixibiyigcd(ai,bi)。 【输入格式】 第一行包含整数 n。接下来 n 行&#xff0c;每行包含两个整数 ai…...

WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?

通过上一章《WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍》&#xff0c;我们知道WEBRTC在完成 SDP 协商和 ICE 候选交换信令后&#xff0c;双方就可以建立 RTP 流&#xff0c;开始传输音视频数据&#xff0c;这时&#xff0c;RTP 数据包就通过在 IC…...

TOA的定位,建模与解算的步骤、公式推导

TOA(到达时间)定位的核心是通过测量信号从目标到多个基站的传播时间,将其转换为距离信息,并利用几何关系解算目标位置。本文给出具体的建模与解算步骤及公式推导 文章目录 通用模型建立非线性方程组构建线性化处理(最小二乘法)最大似然估计(ML)高斯-牛顿迭代法误差分析…...

Python序列化的学习笔记

1. Npy&Numpy O4-mini-Cursor&#xff1a;如果.npy文件里包含了「Python对象」而非纯数值数组时&#xff0c;就必须在加载时加上allow_pickleTrue。...

[C++] 大数减/除法

目录 高精度博客 - 前两讲高精度减法高精度除法高精度系列函数完整版 高精度博客 - 前两讲 讲次名称链接高精加法[C] 高精度加法(作用 模板 例题)高精乘法[C] 高精度乘法 高精度减法 void subBIG(int x[], int y[], int z[]){z[0] max(x[0], y[0]);for(int i 1; i < …...

2025年PMP 学习七 -第5章 项目范围管理 (5.4,5.5,5.6 )

2025年PMP 学习七 -第5章 项目范围管理 5.4 创建 WBS 1.定义与作用 定义把项目可交付成果和项目工作分解成较小的&#xff0c;更易于管理的组件作用对所要交付的内容提供一个结构化的视图 2.输入&#xff0c;输出&#xff0c;工具与技术 3. 创建WBS的依据&#xff08;输入&…...

CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发

CAD插件实现块属性值与excel的互动&#xff0c;效果如下&#xff1a; 加载dll插件&#xff08;CAD 命令行输入netload &#xff0c;运行xx即可导出Excel&#xff0c;运行xx1即可根据excel更新dwg块属性值。&#xff09; 部分代码如下 // 4. 开启事务更新CAD数据using (Transact…...

【HarmonyOS 5】鸿蒙中进度条的使用详解

【HarmonyOS 5】鸿蒙中进度条的使用详解 一、HarmonyOS中Progress进度条的类型 HarmonyOS的ArkUI框架为开发者提供了多种类型的进度条&#xff0c;每种类型都有其独特的样式&#xff0c;以满足不同的设计需求。以下是几种常见的进度条类型&#xff1a; 线性进度条&#xff08;…...

Vue3响应式原理源码解析(通俗易懂版)

一、Vue3响应式核心流程 reactive()&#xff1a; 通过Proxy代理目标对象拦截get/set/deleteProperty等操作使用Reflect执行默认行为 依赖收集&#xff1a; get时通过track函数收集依赖&#xff08;当前执行的effect&#xff09;使用WeakMap建立"target -> key -> d…...

milvus+flask山寨复刻《从零构建向量数据库》第7章

常规练手&#xff0c;图片搜索山寨版。拜读罗云大佬著作&#xff0c;结果只有操作层的东西可以上上手。 书中是自己写的向量数据库&#xff0c;这边直接用python拼个现成的milvus向量数据库。 1. 创建一个向量数据库以及对应的相应数据表&#xff1a; # Milvus Setup Argume…...

Spring Cloud: Nacos

Nacos Nacos是阿里巴巴开源的一个服务发现&#xff0c;配置管理和服务管理平台。只要用于分布式系统中的微服务注册&#xff0c;发现和配置管理&#xff0c;nacos是一个注册中心的组件 官方仓库&#xff1a;https://nacos.io/ Nacos的下载 Releases alibaba/nacos 在官网中…...

AI生成视频推荐

以下是一些好用的 AI 生成视频工具&#xff1a; 国内工具 可灵 &#xff1a;支持文本生成视频、图片生成视频&#xff0c;适用于广告、电影剪辑和短视频制作&#xff0c;能在 30 秒内生成 6 秒的高清视频&#xff08;1440p&#xff09;&#xff0c;目前处于免费测试阶段。 即…...

Win11安装APK方法详解

1、官方win11系统 预览版 开发版 正式版 都行 2、同时你还需要开启主板 BIOS 虚拟化选项&#xff08;具体名称不同主板略有不同&#xff09; 这一步自行百度 开始&#xff1a;先去确定有没有开启虚拟化 任务管理器检查—— 虚拟化是否已经开启&#xff0c;如果没有自己去BIO…...

SSH终端登录与网络共享

SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议 注意 SSH终端登录的前提是&#xff1a;电脑和板卡都能够通过网络相连接及通信 与连接互联网不一样&#xff0c;SSH可以不用互联网&#xff0c;只要电脑和板卡组成一个小型网络即可 网络方案 如果您…...

Android 13 默认打开 使用屏幕键盘

原生设置里&#xff0c;系统-语言和输入法-实体键盘-使用屏幕键盘 选项&#xff0c; 关闭时&#xff0c;外接物理键盘&#xff0c;如USB键盘&#xff0c;输入时不会弹出软键盘。 打开时&#xff0c;外接物理键盘&#xff0c;如USB键盘&#xff0c;输入时会弹出软键盘。 这个选…...

操作系统学习笔记第2章 (竟成)

第 2 章 进程管理 【考纲内容】 1.进程与线程&#xff1a; (1) 进程 / 线程的基本概念&#xff1b; (2) 进程 / 线程的状态与转换&#xff1b; (3) 线程的实现&#xff1a;内核支持的线程&#xff1b;线程库支持的线程&#xff1b; (4) 进程与线程的组织与控制&#xff1b; (5)…...

行业黑化.新平面

最近听了一句行业黑话&#xff1a;"这个功能是新平面吗&#xff1f;" 沙比了吧&#xff0c;什么是平面&#xff0c;还新的&#xff0c;旧的都不动是啥 再结合日常口语"管理面"、"控制面"、"数据面"&#xff0c;问了问DeepSeek 解释还是…...

Veins同时打开SUMO和OMNeT++的GUI界面

进入 Veins 工程目录&#xff08;即包含 sumo-launchd.py 的目录&#xff09;&#xff0c;打开终端设置 SUMO_HOME 环境变量&#xff08;指向你安装的 SUMO 路径&#xff09;&#xff1a; export SUMO\_HOME/home/veins/src/sumo-1.11.0编译 Veins 工程&#xff08;包含 OMNeT…...

复合机器人案例启示:富唯智能如何以模块化创新引领工业自动化新标杆

在国产工业机器人加速突围的浪潮中&#xff0c;富唯智能复合机器人案例凭借其高精度焊接与智能控制技术&#xff0c;成为行业标杆。然而&#xff0c;随着制造业对柔性化、全场景协作需求的升级&#xff0c;复合机器人正从单一功能向多模态协同进化。作为这一领域的创新者&#…...

Python爬虫实战:获取文学网站四大名著并保存到本地

一、引言 1.1 研究背景 中国古典四大名著承载着深厚的文化底蕴,是中华民族的宝贵精神财富。在互联网时代,网络文学资源虽丰富多样,但存在分散、质量参差不齐等问题 。部分文学网站存在访问限制、资源缺失等情况,用户难以便捷获取完整、高质量的经典著作内容。开发专业的爬…...

从需求到用例的AI路径:准确率与挑战

用工作流生成测试用例和自动化测试脚本&#xff01; 引言&#xff1a;用例的黄金起点 在软件工程中&#xff0c;“测试用例”是连接需求理解与质量保障之间的关键桥梁。一份高质量的测试用例&#xff0c;不仅是验证功能实现是否符合需求的工具&#xff0c;更是产品风险感知、用…...

Linux在web下http加密和配置虚拟主机及动态页面发布

web服务器的数据加密 1.简介&#xff1a;由于http协议以明文方式发送&#xff0c;不提供任何方式的数据加密&#xff0c;也不适合传输一些重要的信息&#xff0c;如银行卡号、密码等&#xff0c;解决该缺陷设计了安全套接字层超文本传输协议https&#xff1b; 2.https的握手流…...