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

深入架构剖析 博客点赞逻辑 strategy 策略模式 策略接口 上下文 具体策略 项目实战

目录

点赞策略上下文

策略上下文代码详解

1. 策略模式概述

2. 核心组件

3. 代码解读

LikeStrategyContext 类

LikeTypeEnum 枚举

LikeStrategy 接口

具体策略类

4. 如何使用这个设计

5. 优点

6. 总结

具体代码实现

定义枚举类

从控制层传入参数到上下文

在策略上下文进行详解 传到策略接口的实现类

Strategy 策略接口

StrategyImpl 策略接口实现类

难点 likeStrategyMap

详细解释

1. Map的键:策略名称

2. Map的值:具体策略对象

3. Spring的依赖注入

4. 执行点赞策略

总结


点赞策略上下文

package com.ican.strategy.context;import com.ican.enums.LikeTypeEnum;
import com.ican.strategy.LikeStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Map;/*** 点赞策略上下文** @author Dduo*/
@Service
public class LikeStrategyContext {@Autowiredprivate Map<String, LikeStrategy> likeStrategyMap;/*** 点赞** @param likeType 点赞类型* @param typeId   类型id*/public void executeLikeStrategy(LikeTypeEnum likeType, Integer typeId) {likeStrategyMap.get(likeType.getStrategy()).like(typeId);}
}

策略上下文代码详解

1. 策略模式概述

策略模式是一种行为设计模式,它允许你定义一系列算法(策略),并将每个算法封装在独立的类中,让它们可以互换。策略模式使得算法可以独立于使用它的客户而变化。

2. 核心组件

  • Context(上下文):通常是策略模式中的上下文,负责与策略交互。在你的代码中,LikeStrategyContext是上下文类。
  • Strategy(策略接口):定义了策略的共同接口。在你的代码中,LikeStrategy是策略接口,具体的点赞策略会实现这个接口。
  • ConcreteStrategy(具体策略):实现了具体算法的类。在你的代码中,具体的点赞策略类应该实现LikeStrategy接口,并提供具体的like实现。

3. 代码解读

LikeStrategyContext

这个类充当了策略模式中的 Context,它依赖于具体的点赞策略来完成点赞操作。

java复制代码
@Service
public class LikeStrategyContext {@Autowiredprivate Map<String, LikeStrategy> likeStrategyMap;public void executeLikeStrategy(LikeTypeEnum likeType, Integer typeId) {likeStrategyMap.get(likeType.getStrategy()).like(typeId);}
}
  • likeStrategyMap 是通过 Spring 的依赖注入机制注入的,它是一个 Map,键是策略名称,值是实现了 LikeStrategy 接口的具体点赞策略对象。
  • executeLikeStrategy 方法根据 likeType(点赞类型)从 likeStrategyMap 中获取对应的 LikeStrategy 实现,并执行其 like 方法。
LikeTypeEnum 枚举

这个枚举类定义了不同的点赞类型和对应的策略。

java复制代码
public enum LikeTypeEnum {PHOTO("photoLikeStrategy"),COMMENT("commentLikeStrategy");private final String strategy;LikeTypeEnum(String strategy) {this.strategy = strategy;}public String getStrategy() {return strategy;}
}
  • LikeTypeEnum 定义了两个类型(如:PHOTOCOMMENT),并且每个类型对应一个具体的策略名称(如 photoLikeStrategycommentLikeStrategy)。
  • 通过 getStrategy 方法,LikeTypeEnum 能告诉 LikeStrategyContext 使用哪种具体的点赞策略。
LikeStrategy 接口
java复制代码
public interface LikeStrategy {void like(Integer typeId);
}
  • LikeStrategy 是策略接口,定义了 like 方法,具体的点赞策略需要实现该接口,并提供具体的点赞逻辑。
具体策略类

例如,PhotoLikeStrategyCommentLikeStrategy 类应该实现 LikeStrategy 接口,并根据不同的策略来实现点赞逻辑。

java复制代码
public class PhotoLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 执行照片点赞的具体逻辑}
}public class CommentLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 执行评论点赞的具体逻辑}
}

4. 如何使用这个设计

  • 在应用中,当用户点击点赞时,LikeStrategyContext 会根据传入的 likeType(例如,PHOTOCOMMENT)来选择合适的点赞策略。
  • 通过 likeStrategyMap.get(likeType.getStrategy()),代码能够动态地选择策略,调用其 like 方法,实现不同的点赞行为。

5. 优点

  • 扩展性:当需要新增点赞类型时,只需增加新的 LikeStrategy 实现类和 LikeTypeEnum 中的枚举项,而无需修改现有代码。
  • 解耦:点赞的具体实现被封装在不同的策略类中,LikeStrategyContext 类无需知道具体的点赞细节,只负责调用相应的策略。
  • 灵活性:可以根据不同的 likeType 来选择不同的策略,易于扩展和维护。

6. 总结

这个代码使用了策略模式来实现点赞功能的灵活扩展,不同类型的点赞行为通过不同的策略类实现,LikeStrategyContext 则负责选择合适的策略并执行。这个设计使得点赞功能的扩展更加清晰和易于管理。

具体代码实现

定义枚举类

三种点赞类型

文章 评论 说说

package com.ican.enums;import lombok.AllArgsConstructor;
import lombok.Getter;/*** 点赞类型枚举** @author Dduo*/
@Getter
@AllArgsConstructor
public enum LikeTypeEnum {/*** 文章*/ARTICLE("文章", "articleLikeStrategyImpl"),/*** 评论*/COMMENT("评论", "commentLikeStrategyImpl"),/*** 说说*/TALK("说说", "talkLikeStrategyImpl");/*** 点赞类型*/private final String likeType;/*** 策略*/private final String strategy;}

从控制层传入参数到上下文

以点赞文章举例

    /*** 点赞文章** @param articleId 文章id* @return {@link Result<>}*/@SaCheckLogin@ApiOperation(value = "点赞文章")@AccessLimit(seconds = 60, maxCount = 3)@SaCheckPermission("blog:article:like")@PostMapping("/article/{articleId}/like")public Result<?> likeArticle(@PathVariable("articleId") Integer articleId) {// 策略模式 调用策略上下文 传入参数likeStrategyContext.executeLikeStrategy(LikeTypeEnum.ARTICLE, articleId);return Result.success();}

传入的是枚举类中的数值

传入的是 ID

在策略上下文进行详解 传到策略接口的实现类

三个不同的类中的点赞方法

都调用了这个上下文里面的策略方法
executeLikeStrategy

package com.ican.strategy.context;import com.ican.enums.LikeTypeEnum;
import com.ican.strategy.LikeStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Map;/*** 点赞策略上下文** @author Dduo*/
@Service
public class LikeStrategyContext {// 策略模式使得算法可以独立于使用它的用户而变化@Autowiredprivate Map<String, LikeStrategy> likeStrategyMap;/*** 点赞** @param likeType 点赞类型* @param typeId   类型id*/public void executeLikeStrategy(LikeTypeEnum likeType, Integer typeId) {likeStrategyMap.get(likeType.getStrategy()).like(typeId);}
}

我们通过likeType(枚举值 点赞类型)从 likeStrategyMap 中获取对应的 LikeStrategy 实现,并执行其 like 方法。

Strategy 策略接口

实现了一个点赞的方法

package com.ican.strategy;/*** 点赞策略** @author Dduo*/
public interface LikeStrategy {/*** 点赞** @param typeId 类型id*/void like(Integer typeId);
}

StrategyImpl 策略接口实现类

直接重写方法即可

package com.ican.strategy.impl;import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ican.constant.RedisConstant;
import com.ican.entity.Talk;
import com.ican.mapper.TalkMapper;
import com.ican.service.RedisService;
import com.ican.strategy.LikeStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** 说说点赞策略** @author Dduo*/
@Service("talkLikeStrategyImpl")
public class TalkLikeStrategyImpl implements LikeStrategy {@Autowiredprivate RedisService redisService;@Autowiredprivate TalkMapper talkMapper;@Overridepublic void like(Integer talkId) {// 查询说说Talk talk = talkMapper.selectOne(new LambdaQueryWrapper<Talk>().select(Talk::getId).eq(Talk::getId, talkId));Assert.notNull(talk, "说说不存在");//  public static final String USER_TALK_LIKE = "user_talk_like:";// 用户id作为键,说说id作为值,记录用户点赞记录String userLikeTalkKey = RedisConstant.USER_TALK_LIKE + StpUtil.getLoginIdAsInt();// 判断是否点赞if (redisService.hasSetValue(userLikeTalkKey, talkId)) {// 已经点赞 即将取消点赞 取消点赞则删除用户id中的说说idredisService.deleteSet(userLikeTalkKey, talkId);// 说说点赞量-1redisService.decrHash(RedisConstant.TALK_LIKE_COUNT, talkId.toString(), 1L);} else {// 未点赞 即将进行点赞 点赞则在用户id记录说说idredisService.setSet(userLikeTalkKey, talkId);// 说说点赞量+1redisService.incrHash(RedisConstant.TALK_LIKE_COUNT, talkId.toString(), 1L);}}}

难点 likeStrategyMap

难点无非就是 如何找到对应的策略 执行特定的策略

这边使用的是 likeStrategyMap

likeStrategyMap 是一个 Map 类型的变量,它存储了策略模式中所有可用的点赞策略。这个 Map 通过 Spring 的依赖注入机制(@Autowired)自动填充。在这个设计中,likeStrategyMap 的键是策略的名称(字符串),而值是实现了 LikeStrategy 接口的具体策略对象。

详细解释

1. Map的键:策略名称

likeStrategyMap 的键是一个字符串,代表了不同的点赞策略的名称。例如,可能的策略有“照片点赞策略”、“评论点赞策略”等。

java复制代码
private Map<String, LikeStrategy> likeStrategyMap;

这个 Map 通过 Spring 自动注入,它的键值对是:

  • 键(String):一个策略名称,通常在 LikeTypeEnum 枚举中定义,例如 PHOTO 对应的策略名称是 "photoLikeStrategy"COMMENT 对应的策略名称是 "commentLikeStrategy"
  • 值(LikeStrategy):一个实现了 LikeStrategy 接口的具体策略实例,具体实现了点赞的行为。
2. Map的值:具体策略对象

likeStrategyMap 的值是 LikeStrategy 接口的实现类。每个实现类封装了不同的点赞逻辑,具体的操作可能是对数据库的修改,或者对其他业务逻辑的处理。

例如,PhotoLikeStrategyCommentLikeStrategy 实现了 LikeStrategy 接口,分别处理照片和评论的点赞:

java复制代码
public class PhotoLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 执行对照片的点赞逻辑}
}public class CommentLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 执行对评论的点赞逻辑}
}
3. Spring的依赖注入

Spring 会根据 @Autowired 注解,自动填充 likeStrategyMap。在启动时,Spring 会扫描所有的 LikeStrategy 实现类,并将它们注册到 likeStrategyMap 中。这个过程会通过 Spring 的 @Service@Component 注解完成。

例如,假设你在 @Service 注解的类中定义了 PhotoLikeStrategyCommentLikeStrategy

java复制代码
@Service("photoLikeStrategy")
public class PhotoLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 照片点赞逻辑}
}@Service("commentLikeStrategy")
public class CommentLikeStrategy implements LikeStrategy {@Overridepublic void like(Integer typeId) {// 评论点赞逻辑}
}

通过这种方式,likeStrategyMap 会被自动填充为:

java复制代码
{"photoLikeStrategy" -> PhotoLikeStrategy 实例,"commentLikeStrategy" -> CommentLikeStrategy 实例
}
4. 执行点赞策略

LikeStrategyContext 中,executeLikeStrategy 方法根据传入的 LikeTypeEnum 类型获取对应的策略名称:

java复制代码
public void executeLikeStrategy(LikeTypeEnum likeType, Integer typeId) {likeStrategyMap.get(likeType.getStrategy()).like(typeId);
}

这里的 likeType.getStrategy() 返回的是一个字符串(例如 "photoLikeStrategy""commentLikeStrategy"),likeStrategyMap.get(likeType.getStrategy()) 就会找到对应的策略对象(例如 PhotoLikeStrategyCommentLikeStrategy)。

然后调用这个策略的 like(typeId) 方法来执行相应的点赞逻辑。

总结

  • likeStrategyMap 是一个 Map,存储了所有的点赞策略,键是策略名称(字符串),值是实现了 LikeStrategy 接口的具体策略对象。
  • 通过 Spring 的自动注入机制,likeStrategyMap 会被自动填充,键值对的映射关系基于策略的名称。
  • executeLikeStrategy 方法中,根据 LikeTypeEnum 提供的策略类型,动态选择相应的策略对象执行点赞操作。

这种设计使得策略的选择非常灵活,可以根据需要添加新的点赞策略,而不需要修改原有的

相关文章:

深入架构剖析 博客点赞逻辑 strategy 策略模式 策略接口 上下文 具体策略 项目实战

目录 点赞策略上下文 策略上下文代码详解 1. 策略模式概述 2. 核心组件 3. 代码解读 LikeStrategyContext 类 LikeTypeEnum 枚举 LikeStrategy 接口 具体策略类 4. 如何使用这个设计 5. 优点 6. 总结 具体代码实现 定义枚举类 从控制层传入参数到上下文 在策略上…...

嵌入式Linux之C语言开发基础

一、C 语言编译过程 Linux 的 C 语言开发&#xff0c;一般选择 GCC 工具链进行编译&#xff0c;示例&#xff1a; 1.mkdir helloworld 2.cd helloworld // 1.main.c #include "hello.h" int main() {say_hello();return 0; } // 2.hello.h #ifndef __HELLO_H__ #de…...

std::accumulate

std::accumulate 是 C 标准库中的一个算法&#xff0c;定义在 <numeric> 头文件中。它用于计算给定范围内元素的累积值&#xff08;通常是一个和&#xff0c;但也可以是其他类型的累积操作&#xff09;。 template< class InputIt, class T > T accumulate( Input…...

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层&#xff0c;即传输层&#xff0c;为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议&#xff0c;但两者在设计上有明显的不同&…...

Gitee图形界面上传(详细步骤)

目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe&#xff0c;顺序不能搞错2. …...

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...

苍穹外卖08——(涉及接收日期格式数据、ApachePOI导出报表、sql获取top10菜品数据)

营业额统计 service层 在需要处理空值、与数据库交互或使用集合时&#xff0c;Integer 、Double是更好的选择。 // 导入string工具类 import org.apache.commons.lang.StringUtils; Service // 标记该类为Spring的服务组件 Slf4j // 引入日志功能 public class Repor…...

Node.js——fs(文件系统)模块

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …...

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…...

大语言模型预训练、微调、RLHF

转发&#xff0c;如有侵权&#xff0c;请联系删除&#xff1a; 1.【LLM】3&#xff1a;从零开始训练大语言模型&#xff08;预训练、微调、RLHF&#xff09; 2.老婆饼里没有老婆&#xff0c;RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...

啥!GitHub Copilot也免费使用了

文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近&#xff0c;GitHub 给开发者们带来了一个好消息&#xff1a;他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了&#xff01;以前&#xff0c;每个月要花 10 美元才能享受的服务&#xff0c;现在对所…...

【Ubuntu与Linux操作系统:五、文件与目录管理】

第5章 磁盘存储管理 5.1 Linux磁盘存储概述 磁盘存储是Linux系统存储数据的重要组件&#xff0c;它通过分区和文件系统组织和管理数据。Linux支持多种文件系统&#xff0c;如ext4、xfs和btrfs&#xff0c;并以块的形式管理存储设备。 1. 分区与文件系统&#xff1a; 分区&am…...

【PDF转Word】 PDF在线转word文档 好用!优质网站资源推荐

大家在工作与学习中&#xff0c;经常需要将PDF文件转换为Word格式以便进行编辑和修改。很多人都不知道怎么操作&#xff0c;今天我们介绍一个非常好用的工具&#xff1a;小白工具网&#xff0c;可以在线帮忙大家快速把PDF转换成word格式。 小白工具网提供的PDF转Word功能&…...

计算机网络 (38)TCP的拥塞控制

前言 TCP拥塞控制是传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09;避免网络拥塞的算法&#xff0c;是互联网上主要的一个拥塞控制措施。 一、目的 TCP拥塞控制的主要目的是防止过多的数据注入到网络中&#xff0c;使网络能够承受现有的网络…...

构造函数的原型原型链

代码示例 // 定义一个构造函数 Test function Test() {this.name 张三 }; //向构造函数的原型添加一个属性 age18 Test.prototype.age 18;//使用构造函数 Test 来实例化一个新对象 const test new Test();//向 Object.prototype 添加了一个名为 sex 的属性&#xff0c;其值…...

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…...

[RabbitMQ] RabbitMQ运维问题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

GenAIOps:生成式 AI 运维 - 实用指南

https://medium.com/google-cloud/genaiops-operationalize-generative-ai-a-practical-guide-d5bedaa59d78​​​​​​ 作者&#xff1a;Dr Sokratis Kartakis 从创意到生产&#xff1a;使用生成式 AI 和运维 (GenAIOps) 概述 生成式 AI (GenAI) 的世界充满了令人兴奋的可…...

用户界面软件04

后果 使用这种架构很容易对两个层面的非功能性需求进行优化&#xff0c;但是你仍然需要小心不要将功能 需求重复实现。 现在&#xff0c;两个层面可能有完全不同的设计。比如&#xff0c;用户界面层可能使用配件模型&#xff08;Widget Model&#xff09;&#xff0c; 以大量的…...

分布式系统设计:Java的秘密基地布局

分布式系统设计是Java企业级开发中的一个关键领域&#xff0c;它涉及到构建高可用、可扩展、高性能的系统。以下是分布式系统设计的一些核心概念和实践&#xff1a; 3.1 分布式系统的特点 分布式系统由多个独立的计算机节点组成&#xff0c;这些节点通过网络连接在一起&#x…...

【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿

文章目录 完成任务1. 什么是缓存2. 添加商户缓存3. 缓存更新策略3.1 主动更新 4. 缓存穿透5. 缓存雪崩6. 缓存击穿6.1 使用互斥锁查询商铺信息6.2 使用逻辑过期查询商铺信息 7. 封装 Redis 工具类 完成任务 1. 什么是缓存 缓存&#xff1a;数据交换的缓冲区&#xff08;Cache…...

MySQL索引覆盖(覆盖索引, Covering Index)

文章目录 说明MySQL索引覆盖&#xff08;覆盖索引, Covering Index&#xff09;覆盖索引的概念覆盖索引的示例示例查询及索引覆盖情况覆盖索引的性能优势覆盖索引的实现条件覆盖索引 vs 非覆盖索引覆盖索引的限制如何设计覆盖索引覆盖索引的实际案例场景 1&#xff1a;电商系统…...

VUE3 provide 和 inject,跨越多层级组件传递数据

provide 和 inject 是 Vue 3 提供的 API&#xff0c;主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中&#xff0c;跨越多层组件传递数据&#xff0c;而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...

【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程

目录 前言 步骤 一、新建插件 二、创建第三方库 三、使用第三方库 前言 主要就是介绍如何将普通C++工程生成的头文件和.dll导入到UE中去使用。 步骤 一、新建插件 1. 打开插件浏览器选项卡 2. 打开插件创建器 3. 选择“第三方库”,这里命名为“MyThirdPartyLibrary…...

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...

20250112面试鸭特训营第20天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 250112 1. TCP 和 UDP 有什么区别&#xff1f; 特性TCPUDP连接方式面向连接&#xff08;需要建立连接&#xff09;无连接&#xff08;无需建立连接&#xff09;可靠性可靠的&#xff0c;提供确认、重传机制不可靠&#xff0c…...

使用conda出现requests.exceptions.HTTPError 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...

【玩转MacBook】mdfind命令搜索

mdfind 是 macOS 上的一个命令行工具&#xff0c;它允许用户根据元数据来查找文件。mdfind 使用 Spotlight 索引来快速搜索文件系统中的项目。这意味着它可以非常快地找到文件&#xff0c;因为它不直接在磁盘上搜索&#xff0c;而是查询由 Spotlight 维护的索引数据库。 基本用…...

数据结构与算法之二叉树: LeetCode 637. 二叉树的层平均值 (Ts版)

二叉树的层平均值 https://leetcode.cn/problems/average-of-levels-in-binary-tree/description/ 描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受 示例 1 输入&#xff1a;root…...

【巨实用】Git客户端基本操作

本文主要分享Git的一些基本常规操作&#xff0c;手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置&#xff08;第一次使用或者需求变更的时候&#xff09;&#xff0c;告诉git未来是谁在提交代码 git config --global user.na…...

从预训练的BERT中提取Embedding

文章目录 背景前置准备思路利用Transformer 库实现 背景 假设要执行一项情感分析任务&#xff0c;样本数据如下 可以看到几个句子及其对应的标签&#xff0c;其中1表示正面情绪&#xff0c;0表示负面情绪。我们可以利用给定的数据集训练一个分类器&#xff0c;对句子所表达的…...

BGP 泄露

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 目录 1. BGP 是什么&#xff1f; 2. 什么是 BGP 泄露&#xff1f; 3. 今天发生了什么&#xff1f; 4. 正常和被劫持状态下的路由示意图 5. 受影响区域 6. 责任在谁&#xff1f; 7. 有办法避免这…...

IntelliJ IDEA和MAVEN基本操作:项目和缓存存储到非C盘

为了将 IntelliJ IDEA 的所有项目和缓存存储到 C 盘以外的地方&#xff0c;以下是你需要调整的设置和步骤&#xff1a; 1. 更改项目默认存储位置 打开 IntelliJ IDEA。点击顶部菜单的 File > Settings &#xff08;Windows&#xff09;或 IntelliJ IDEA > Preferences &…...

Leetcode 3418. Maximum Amount of Money Robot Can Earn

Leetcode 3418. Maximum Amount of Money Robot Can Earn 1. 解题思路2. 代码实现 题目链接&#xff1a;3418. Maximum Amount of Money Robot Can Earn 1. 解题思路 这一题我的思路比较暴力&#xff0c;就是一个动态规划&#xff0c;本质上就是全量遍历&#xff0c;然后找到…...

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...

SYS_OP_MAP_NONNULL NULL的等值比较

无意在数据库中发现了这个操作SYS_OP_MAP_NONNULL。 SYS_OP_MAP_NONNULL应该不是数据库中的对象&#xff0c;因为在DBA_OBJECTS中根本找不到它&#xff0c;而在STANDARD和DBMS_STANDARD包中也找不到函数说明。 SQL> SELECT * 2 FROM DBA_OBJECTS 3 WHERE OBJECT_NAME…...

acwing_3196_I‘m stuck

acwing_3196_I’m stuck // // Created by HUAWEI on 2024/11/17. // #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 50 5; char g[N][N];// 地图 bool str1[N][N], str2[N][N]; // 判断1&#xff0c;判断2 …...

C++实现设计模式---状态模式 (State)

状态模式 (State) 状态模式 是一种行为型设计模式&#xff0c;它允许对象在运行时根据内部状态的改变来动态改变其行为。通过将状态相关的行为封装到独立的类中&#xff0c;状态模式使得状态的切换更加清晰和灵活。 意图 将对象的行为和状态分离&#xff0c;随着状态的改变动…...

【1】Word:邀请函

目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开&#xff0c;wps打开作答无效☞作答完毕&#xff0c;F12或者手动另存为&#xff08;考生文件夹&#xff1a;路径文件名&#xff09; 注意&#xff1a;一定要检查&#xff0c;很有可能你前面步…...

作业(一)

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 # vim a.sh#!/bin/bash​#先对文件/tmp/size.log 是否存在进行判断 if [ -f /tmp/size.log ]; #如果存在&#xff0c;则用cat命令显示文件内容thencat /tmp/…...

[SAP ABAP] APPEND INITIAL LINE 追加空行

语法格式 APPEND INITIAL LINE TO itab.示例1 SFLIGHT(航班) 输出结果&#xff1a; 示例2 我们可以使用下面的语法进行内表分配指针&#xff0c;追加空行并赋值的操作 APPEND INITIAL LINE TO lt_tab ASSIGNING FIELD-SYMBOL(<lfs_val>). REPORT z437_test_2025.* 自…...

Meilisearch ASP.Net Core API 功能demo

安装 MeiliSearch 0.15.5 0.15.5demo code using Meilisearch; using System.Data; using System.Text.Json; using System.Text.Json.Serialization;namespace MeiliSearchAPI {public class MeilisearchHelper{public MeilisearchHelper(){DefaultClient…...

口碑很好的国产LDO芯片,有哪些?

在几乎任何一个电路设计中&#xff0c;都可能会使用LDO&#xff08;低压差线性稳压器&#xff09;这个器件。 虽然LDO不是什么高性能的IC&#xff0c;但LDO芯片市场竞争异常激烈。最近几年&#xff0c;诞生了越来越多的精品国产LDO&#xff0c;让人看得眼花缭乱。 业内人士曾经…...

深入浅出C#线程池ThreadPool:提升程序性能的利器

深入浅出C#线程池ThreadPool&#xff1a;提升程序性能的利器 在C#编程中&#xff0c;线程是并发编程的基石&#xff0c;它使我们能够同时执行多个任务&#xff0c;提升程序的响应速度和效率。然而&#xff0c;直接创建和管理线程会带来一定的开销&#xff0c;例如线程创建和销…...

git问题

拉取项目代码后&#xff0c;出现 1、找回未commit的代码 2、记录不全&#xff0c;只是显示部分代码记录...

Code-Server 项目介绍与部署指南

搜索关注&#xff0c;分享更多有趣的知识。 在这里插入图片描述 1. 概述 GitHub&#xff1a; https://github.com/coder/code-server 在日常学习和工作中&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已成为许多开发者的首选代码编辑器。然而&#xff0c;其…...

NAT技术

NAT技术 1. NAT原理 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是用于在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。路由器构建了子网&#xff0c;将…...

pytest 常用插件

pytest 提供了许多功能强大的插件来增强测试体验和执行能力。以下是一些常用的 pytest 插件介绍&#xff0c;并结合 pytest.main() 进行使用的示例。 1. pytest-xdist pytest-xdist 插件用于并行化测试的执行&#xff0c;可以将测试分配到多个 CPU 核心并行运行&#xff0c;从…...