让代码变美的第二天 - 策略模式

利用netns做自环Iperf测试 netns可以让一台机器上模拟多个网络设备,是网络虚拟化的重要组成,将不同类型的网络应用隔离。一个net namespace有自己独立的路由表,iptables策略,设备管理。本文利用netns模拟网络来实现单机上网卡自环上的iperf测试或其他网络测试。 阅读详情

丑陋的模样

    public Fruit buyFruit(String name) {
        if ("苹果".equals(name)) {
            return new BuyApple().buy();
        } else if ("香蕉".equals(name)) {
            return new BuyBanana().buy();
        } else if ("西瓜".equals(name)) {
            // 买西瓜
            if (true) {
                // todo
            } else {
                // todo
            }
        }
        return null;
    }
  • 分支判断越来越多,方法就会越来越大,就算每个分支压缩到一个function,当超过一定数量也会很难看。最重要的是破坏了设计的开闭原则。

变美步骤

第一步 - 基本预期

思考:这个功能,这个方法改动到底是不是很频繁,新增的判断逻辑(if else)将来会不会很频繁。有个预期就行,如果没有预期,那就看实际改动次数。

  • 如果不频繁,建议就这样吧,只要结构清晰,方便review代码就行。不鼓励过度设计,毕竟开发时间都是有限的。
  • 如果很频繁,就看第二步

第二步 - 梳理核心逻辑

判断当前功能是不是都是由一个策略值,来决定后面整体流程,并且每个流程都不太相同,这样容易想到可以使用策略模式来进行优化。
如果当前功能不光有不同策略处理流程,还有共同的处理流程,那么可以把不同策略处理流程抽取出来,使用策略模式进行优化,共同的部分不在本文讨论范围内。

第三步 - 重构

只讨论使用spring项目
给策略进行定义,比如水果场景

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FruitScene {
    String value();
}

给所有策略对应的处理流抽象成一个方法,取个名字,比如买水果

public interface BuyFruit {
    Fruit buy();
}

定义每个策略对应处理流程,比如买苹果、买香蕉

@Component
@FruitScene("苹果")
public class BuyApple implements BuyFruit {
    @Override
    public Fruit buy() {
        System.out.println("买苹果");
        return new Fruit("苹果");
    }
}
@Component
@FruitScene("香蕉")
public class BuyBanana implements BuyFruit {
    @Override
    public Fruit buy() {
        System.out.println("买香蕉");
        return new Fruit("香蕉");
    }
}
  • 将来新增处理流程只需要新增一个类、方法

把定义的策略场景和处理流程进行关联

@Component
public class BuyFruitFactory {
    private static Map<String, BuyFruit> getBuyFruitMap = new HashMap<>();

    @Autowired
    private void setBuyFruitMap(List<BuyFruit> buyFruitList) {
        buyFruitList.forEach(fs -> {
            FruitScene fruitScene = fs.getClass().getAnnotation(FruitScene.class);
            if (fruitScene != null) {
                getBuyFruitMap.put(fruitScene.value(), fs);
            }
        });
    }

    public static Fruit buy(String fruitName) {
        return getBuyFruitMap.get(fruitName).buy();
    }
}

最终使用方式 - 优雅的一行代码

    public Fruit buyFruit2(String name) {
        return BuyFruitFactory.buy(name);
    }

点题

看起来整体代码变得更复杂了?哪里体现了开放封闭?
上面的例子只有两种策略,所以看起来代码变多了。如果策略很多,实际上重构后的代码基本都是固定的(无需更改),每次有新的策略流程,只需要实现BuyFruit接口即可(步骤2),做到了对扩展是开放的,而对修改是封闭的。

GaN功率放大器设计避坑指南:从仿真到实测的Doherty PA完整流程(基于ADS 2023) 本文详细介绍了基于ADS 2023软件,从理论计算、电路仿真到版图后仿真的GaN Doherty功率放大器完整设计流程。文章聚焦C波段应用,深入剖析了负载调制网络设计、稳定性处理、版图电磁仿真等关键环节中的常见误区与工程折衷,为工程师提供了一套从设计到实测的实战避坑指南。 阅读详情

相关推荐

别再到处找DEM了!手把手教你免费下载90米、30米、12.5米全球高程数据(附国内网盘链接)

本文详细介绍了如何免费获取全球90米(SRTM3)、30米(ASTER GDEM)和12.5米(ALOS)高精度DEM数据,并提供了国内网盘链接以绕过国际平台访问障碍。通过对比不同数据源的特点和适用场景,帮助用户根据项目需求选择最合适的DEM数据,同时分享了数据处理和质量提升的实用技巧,实现从数据获取到应用的无缝衔接。

weixin_28725949的博客 668

最少知识原则之模式的黄金原则

最少知识原则的终极目标的是实现完全傻瓜式的程序。 举个例子吧, 就比如 美图神器, 你上传一张凤姐的照片后,你可以选择 自然磨皮,高度磨皮 -> 瘦脸,瘦腿模式 -> 美瞳-> 手动丰胸等等。 当然, 你也可以直接使用一键美化,瞬间angelababy. 你完全不用关心,这些软件是怎样实现这些功能的,让你变美变美变...

weixin_34376562的博客 90

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

Claude Code 原生 Agent 编排配置与使用手册:Subagents + Agent Teams 双平台落地指南

Subagents 是 Claude Code 原生功能。没有自定义角色文件时,Claude 仍可使用内置的 Explore、Plan、General-purpose 等 Subagents,根据任务自行委派。用户提问 -> 主 Agent 判断 -> 调用 Subagent -> 子 Agent 返回结论 -> 主 Agent 继续自定义 Agent 是可选项,建议只有当某类任务反复出现、专用权限确有价值时才配置。检查文件位置和 YAML frontmatter:第一行必须是---,同时要有合法name。

weixin_45284808的博客 476

【SEED Labs 2.0】V*N Tunneling Lab

本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。本实验工作量较大,但难度不大,重点在于搞清是谁发给谁,走的什么路径。另外,本次实验由于网络中的设备较多,修改了环境变量方便分清哪个窗口是哪个设备。这样操作起来就方便多了。...

Chenyang的博客 6973

从 PI Start Page 到 ESR、ID、SLD,重新理解 SAP PI 的工具访问体系

摘要 SAP PI工具入口设计反映了系统核心分工逻辑。不同角色通过特定入口访问专属工具:集成顾问使用Enterprise Services Builder设计接口,BASIS管理员通过SAP NetWeaver Administrator监控运行状态,技术顾问在Integration Builder配置路由,系统维护则需进入System Landscape Directory。这种设计体现了PI平台将工作划分为管理、技术配置、设计、业务配置和监控五大领域。尤其值得注意的是技术配置与业务配置的连续性关系,如I

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1867

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 339

用miniconda建立PyTorch、Keras、TensorFlow三个环境

如果还没有安装Miniconda,请从[Miniconda官网](https://docs.conda.io/en/latest/miniconda.html)下载合适的版本并进行安装。如果遇到问题,可以通过编辑`~/.condarc`文件来临时禁用某个源,或者通过`conda config --remove channels`命令来移除配置的镜像源。要切换到不同的环境,先使用`conda deactivate`命令退出当前环境,再用`conda activate 环境名称`命令激活另一个环境。

数字人生 2464

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 218

【社招算法经验贴】算法社招记录

总的来说,也是收获了七七八八的offer,给的涨幅40~100%,职级有的可以对标到 p7(但阿里p7是真难a,a不动)。面了一圈下来,感觉大模型也在收缩hc。尤其是多模态相关hc。凭着上学期间做过相关视觉的work和paper,社招虽然能进面试,但是hc少得可怜,多模态已死慎入。还有大模型应用算法给的涨幅,跟搜广推的涨幅差别不大。真正能几百万往上的是基座pretrain/后训练/infra,但是全靠social和conn,hc极少。

Danger的博客 976

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3267

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 327

Android HAL 架构详解,底层开发不再难

HAL Binder 这套机制牛在哪?性能:一次拷贝,快如闪电。规范:HIDL 让接口定义整齐划一,维护省心。兼容:版本管理做得好,新老设备都能跑。有了这套通信体系,HAL 就像打了通脉,上下贯通,硬件操作变得丝滑无比。通信机制搭好了桥,接下来 HAL 得真正把手伸到硬件上。这部分是 HAL 的 “最后一公里”,直接决定硬件能不能被用起来。HAL 的接口定义是整个体系的灵魂,它决定了上层和底层怎么 “说话”。

大模型大数据攻城狮的专栏 1671

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

# SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在 > 这是一套基于 Spring Boot 的服装销售平台源码,配套 `db.sql` 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是**前后台双端**:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑

面朝大海 218

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

基于 Springboot3+SpringAI+Agent+RAG+Function Calling的校园闲置物品循环流转 AI 智能估价平台

基于SpringBoot3+SpringAI1.0,打造校园闲置循环平台,实现从发布、智能估价(规则+大模型校准)、担保交易到信用治理与运营看板的闭环。通过RAG问答、FunctionCalling工具调用、流式SSE输出及本地降级策略,将AI能力深度嵌入业务链路。项目强调可落地性:无APIKey也能演示,向量存MySQL,状态机防绕过,代码清晰可读。适合想做真实AI全栈项目、准备面试或提升工程化思维的开发者。

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 288

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Agent 点了“允许”之后:用 Spring AI 2.1 验证工具确认的边界

基于 Spring AI 2.1.0-RC1 预览版的本地计数器实验,验证同一回复整批暂停、恢复时逐项决策,以及相同确认重放仍会再次执行工具。结合源码解释审批身份、原始参数和业务幂等的分工,给出完整复现代码;不连接模型或真实业务。

冷脸萌萌的技术实践 71

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring AI 提示词实战指南:四大角色、格式化与避坑

3. → ToolResponseMessage([ToolResponse(id:"call_1", name:"queryDtc", responseData:"...")]) ← 你的程序执行后回填。2. → AssistantMessage(toolCalls=[{id:"call_1", name:"queryDtc", args:{code:"P0301"}}]) ← 模型说"我要查"@JsonPropertyDescription("最可能的原因,一句话") String cause,

qq654207743的博客 710

基于SpringBoot的营养食谱管理系统设计与实现-附源码

基于SpringBoot的营养食谱管理系统,实现食谱、食材与营养数据的数字化管理,支持多条件筛选、个性化饮食方案定制及收藏功能,助力用户科学饮食,提升营养师管理效率。系统采用前后端分离架构,技术栈成熟,功能完整,测试验证通过,具备良好可扩展性,未来可集成体质测评、饮食打卡等智能功能。

专注于大学生项目实战开发,讲解,毕业答疑辅导,java就业辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。全网粉丝10w+,平台优质java、小程序创作者。 306

Spring AI 全模块 API 字典一览(1.1.0 版)

本文为 Spring AI 1.1.0 全量字典,涵盖模型接入(ChatModel)、Prompt与Message架构、ChatOptions配置及实战用例。重点解析 call()/stream() 方法签名、Prompt 消息封装机制、ChatResponse 响应结构,以及工具调用(ToolCall/ToolResponse)的配对逻辑。附真实项目用例(如 WebSearchReactAgent、PlanExecuteAgent),强调多轮对话记忆机制、流式处理防空策略与参数配置顺序陷阱,适配 Open

Java 后端学习者。写 JUC 并发、Redis 实战,也记录 LLM 应用开发(Spring AI / RAG / Agent)的学习实录——少讲概念,多讲过程和踩坑。 594

Spring系列03:Bean 的三种注册方式

写 Spring 的人,几乎天天在「把一个对象交给容器」。@Service标一下、配置类里@Bean写一个、或者丢一堆方法——但它们本质不是一回事。很多开发者能把三种写法都写出来,一被问「@Bean放在@Component和里到底差在哪」「为什么有的@Bean互相调用拿的是同一个实例、有的却 new 了好几个」,就卡壳了。这一篇把三种注册方式的身世、边界,以及那个最容易被忽略的 full/lite 玄机一次讲透。方式一:组件扫描( Stereotype +——类上贴注解,容器扫包自动认。@Bean方法。

liangbo7的博客 203

同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)

本文以“技术问答助手”为例,对比Spring AI、LangChain4j与AgentScope Java实现RAG+工具调用的三套方案。三者均支持流式输出与知识检索,但风格迥异:Spring AI强调命令式流畅,LangChain4j采用声明式接口,AgentScope则以Agent编排为核心。代码量与心智模型差异显著,适用于单体智能(前两者)或多智能体系统(后者)。最终建议根据项目形态选型,实现从“能用”到“好用”的跃迁。

weixin_43128865的博客 430

(开源)宠物共享平台实战指南 基于 Java + SpringBoot + Web + MySQL

这是一个基于 Java + SpringBoot + Vue + MySQL 构建的完整宠物共享平台(管理端为 Vue,用户端为纯静态 Web 站,由后端直接托管),功能持续优化中...用户登录 / 注册 宠物寄养管理 / 寄养审核 寻宠启事管理 / 认领审核 宠物视频管理 / 视频收藏 / 视频留言 感谢信管理 公告管理 轮播图信息管理 基础数据管理 用户管理 / 管理员管理 个人中心 其它...

小小码农身兼魔法师职位!除你武器~ 386

注解与 Spring 核心注解

注解仅为元数据,需被代码读取才生效。Spring核心注解如@Component、@Autowired、@Configuration等依赖反射机制在运行期被容器解析,若类未被扫描、对象非容器管理或方法未被代理,注解将失效。关键点:注解本身不执行逻辑,真正起作用的是读取它的代码是否执行。正确使用@Retention(RUNTIME)、合理选择@Component与@Bean、理解@Autowired与@Resource匹配差异,是避免“注解没反应”的核心。

2401_89855466的博客 147

第17课:SpringBoot 任务处理:异步任务@Async、定时任务@Scheduled,线程池配置

本文详解Spring Boot 4.x异步与定时任务的实战应用,聚焦虚拟线程带来的范式变革。基于Java 21+,@Async默认使用高效虚拟线程,大幅提升IO密集型任务吞吐量;@Scheduled支持动态配置与多任务并发。重点讲解线程池自定义、异常处理、上下文传递、cron表达式及生产级排查技巧,结合AOP代理与源码分析,构建高可用任务体系。

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 339

SpringAOP(1)

AOP(面向切面编程)是OOP的补充,通过切面实现横切关注点的模块化。Spring AOP通过@Aspect、@Component注解定义切面,结合@Pointcut抽取切点,支持@Before、@After等通知类型,可无侵入地实现日志、性能监控等功能。利用@Order可设定优先级,提升代码复用性与可维护性,有效减少重复代码,提高开发效率。

captain376的博客 72

基于SpringBoot的心理咨询预约管理系统设计与实现

本文设计并实现基于SpringBoot3的心理咨询预约管理系统,涵盖来访者、咨询师、管理员三类角色,支持在线预约、排班管理、档案记录与权限隔离。系统采用前后端分离架构,保障数据安全与隐私保护,提升心理服务数字化水平。后续可拓展在线沟通、测评问卷与消息提醒功能,进一步优化用户体验。

专注于大学生项目实战开发,讲解,毕业答疑辅导,java就业辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。全网粉丝10w+,平台优质java、小程序创作者。 492
上一篇: 让代码变美的第一天 - 观察者模式
下一篇: 让代码变美的第三天 - 简单工厂模式
帅东
博客等级 码龄11年 676粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值