【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

请添加图片描述

半桔个人主页
 🔥 个人专栏: 《设计模式》《手撕面试算法》《C++从入门到入土》

🔖恐惧囚禁人的灵魂,希望可以让你自由。《肖申克的救赎》

文章目录

一. 光头强转行

1.1 团结屯的故事

我是光头强。以前,我每天的生活就是被两头臭狗熊按在地上摩擦,不仅树砍不到,还要承受李老板的夺命连环Call和扣工资威胁。

直到有一天,我捡到了一本《C++ Primer》(虽然我也忘了森林里为啥会有这书)。那一刻,我悟了!砍树是没有前途的,计算机才是第一生产力

我狠下心来闭关修炼,左手C++,右手面向对象(OO),发际线虽然更高了(额,我好像也没什么头发),但我感觉自己强得可怕。于是,我把电锯一扔,拿起键盘,给李老板发了辞职信:“世界那么大,我想去敲代码。”

李老板一听我要走,顿时慌了:“强子!你走了,《熊出没》还怎么拍?这动画片没反派怎么行?这样,工资翻倍(虽然原来只有300),给你安排新岗位:首席架构师。你给我开发一个《狗熊模拟器》!”

为了那点窝囊费……啊不,为了展现我的技术。

1.2 新工作,新需求

项目需求文档 - 《狗熊模拟器 v1.0》
甲方
:李老板
描述:模拟团结屯狗熊的习性。
功能点:冬眠、爬树、居住习惯,以及最喜欢的食物。

二. 光头强的OO天赋

看完需求,我嘴角上扬。这不就是典型的继承题吗? 既然熊大熊二都住在团结屯,除了吃的口味不同,其他行为(冬眠、爬树、住树洞)完全一致。 我决定使用继承大法,主打一个代码复用,少写一行是一行。

请添加图片描述
classBear{public:virtual std::string FavoriteFood()=0;voidHibernation(){ std::cout <<"进行冬眠"<< std::endl;}voidClimbTree(){ std::cout <<"会爬树"<< std::endl;}voidLivingHabit(){ std::cout <<"住在树洞里面"<< std::endl;}protected:};classXiongDa:publicBear{public: std::string FavoriteFood()override{return"苹果";}};classXiongEr:publicBear{public: std::string FavoriteFood()override{return"蜂蜜";}};

代码行云流水,提交Git,李老板看后直呼内行。

三. 李老板的新需求

李老板发现这个程序很有商业价值,格局打开,要把业务扩展到全宇宙的森林,不只是团结屯。

3.1 出大问题了

新增需求:系统要支持北极熊、熊猫、甚至玩具熊。

这时候我才发现,刚刚为了偷懒把 HibernationClimbTree写死在基类里,简直是在给自己挖坑!

  • 北极熊:不冬眠啊!
  • 玩具熊:人家连活物都不是,爬个鬼的树!

如果继续用继承,我只能**覆盖基类的方法了:

请添加图片描述

为了适配新物种,我必须在每个子类里重写代码。

  • 如果有100种不冬眠的熊,我就要写100遍“不冬眠”的函数?

我希望通过继承的方式来达到代码复用的目的,但是涉及到维护时,效果并不是那么好,现在代码已经完全不能进行代码的复用了。

3.2 继承可能不是答案

我痛定思痛,回想起那本C++圣经上的教诲:

设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

简单说就是:既然“怎么爬树”和“怎么冬眠”是会变的,那就把它们踢出 Bear 类,单独封装!
我要把“行为”变成一种“零件”,哪只熊需要什么零件,组装上去就行了。这就是组合
你决定将基类的方式实现进行封装起来,对代码进行重构。

现在,Bear 类不再亲自负责实现“爬树”这个动作,它只负责拥有一个“爬树行为”的接口。
具体怎么爬?让接口的实现类去操心吧!

请添加图片描述

四. 最终方案

为了代码整洁,我们专注于重构 HibernationClimbTree 这两个变化点。

  1. 先把“怎么冬眠”抽象成一个接口族:
classHibernation_Behavior{public:virtualvoidHibernation()=0;};classHibernation_able:publicHibernation_Behavior{public:voidHibernation()override{ std::cout <<"进行冬眠"<< std::endl;}};classHibernation_unable:publicHibernation_Behavior{public:voidHibernation()override{ std::cout <<"不需要冬眠"<< std::endl;}};
  1. 同理,把爬树能力也拆分出来:
classClimbTree_Behavior{public:virtualvoidClimbTree()=0;};classClimbTree_able:publicClimbTree_Behavior{public:voidClimbTree()override{ std::cout <<"会爬树"<< std::endl;}};classClimbTree_unable:publicClimbTree_Behavior{public:voidClimbTree()override{ std::cout <<"不需要爬树"<< std::endl;}};
  1. 重构 Bear 类
classBear{public:virtualvoidHibernation()=0;virtualvoidClimbTree()=0;protected: std::shared_ptr<Hibernation_Behavior> hibernation_behavior_; std::shared_ptr<ClimbTree_Behavior> climbTree_behavior_;};
  1. 各种熊的实现:
classBrownBear:publicBear{public:BrownBear(){ hibernation_behavior_ = std::make_shared<Hibernation_unable>(); climbTree_behavior_ = std::make_shared<ClimbTree_able>();}voidHibernation(){ hibernation_behavior_->Hibernation();}voidClimbTree(){ climbTree_behavior_->ClimbTree();}};classPanda:publicBear{public:Panda(){ hibernation_behavior_ = std::make_shared<Hibernation_unable>(); climbTree_behavior_ = std::make_shared<ClimbTree_able>();}voidHibernation(){ hibernation_behavior_->Hibernation();}voidClimbTree(){ climbTree_behavior_->ClimbTree();}};

五. 总结

这就是传说中的策略模式(Strategy Pattern)

通过把 Hibernation_BehaviorClimbTree_Behavior 定义为算法族,我们将行为的实现与使用行为的 Bear 类彻底解耦。

好处显而易见:

  1. 复用性起飞:如果不冬眠的代码逻辑变了,我只需要改 Hibernation_unable 这一个类,所有不冬眠的熊都会自动更新。
  2. 扩展性无敌:李老板要是让我加个“机械熊”,我只需要新写一个 RocketJump_Behavior,然后在机械熊里装配上就行,根本不用去动原来的代码。
最后策略模式定义就是: 定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

好了,代码写完了,李老板对此非常满意,决定再奖励我加班修Bug。我要去砍树…啊不,去Debug了,下期见!

Read more

OpenCopilot与Slack深度集成:7步构建智能团队协作系统

OpenCopilot与Slack深度集成:7步构建智能团队协作系统 【免费下载链接】OpenCopilot🤖 🔥 AI Copilot for your own SaaS product. Shopify Sidekick alternative. 项目地址: https://gitcode.com/gh_mirrors/op/OpenCopilot 在数字化转型浪潮中,企业面临的最大挑战之一是如何将AI智能无缝融入日常团队协作。OpenCopilot与Slack的集成方案提供了完整的解决路径,让团队在熟悉的沟通环境中获得专业级的AI支持。这套系统通过智能对话、工作流自动化和实时决策辅助,彻底改变了传统团队协作模式。 核心价值:从被动响应到主动赋能 传统Slack使用中,团队成员需要手动搜索信息、协调任务分配,而集成了OpenCopilot的Slack系统能够实现: * 智能任务分配:基于项目进度自动分配资源 * 实时问题解决:在对话中直接提供解决方案 * 跨系统数据整合:连接CRM、项目管理工具等多个数据源 技术架构:三层集成模型 应用层集成 通过

By Ne0inhk
LLaMA-Factory 大模型微调平台

LLaMA-Factory 大模型微调平台

目录 文章目录 * 目录 * LLaMA-Factory * LLaMA-Factory + Qwen3-7B + LoRA * 安装部署 * 准备数据集 * 执行微调 * 批量推理和训练效果评估 * LoRA 模型合并导出 * 部署运行微调后的大模型 LLaMA-Factory Llama-Factory 是基于 transformers 库开发的训练、微调、推理一体化平台,支持预训练、指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等多种训练范式。支持使用 Accelerate 或 DeepSpeed 作为训练加速后端。 使用 Llama-Factory 进行微调非常简单,因为其最大的优势在于强大的数据处理与训练配置能力。只要按照官方的文档配置好环境,直接运行对应的脚本即可。 LLaMA-Factory + Qwen3-7B + LoRA 安装部署 * 容器安装 git clone

By Ne0inhk

Qwen3-1.7B代码生成效果如何?GitHub Copilot类比评测

Qwen3-1.7B代码生成效果如何?GitHub Copilot类比评测 最近,阿里开源了新一代的千问大模型系列——Qwen3。这个系列阵容强大,从0.6B到235B,各种尺寸都有。今天,咱们不聊那些动辄几百亿参数的大块头,就聚焦一个特别有意思的小家伙:Qwen3-1.7B。 为什么是它?因为1.7B这个参数量,刚好卡在一个很微妙的位置:它比那些动辄几十亿参数的“大模型”轻巧得多,理论上部署和推理成本都更低;但又比一些纯玩具级别的微型模型要“聪明”不少。更重要的是,它主打的就是代码生成能力。 这让我立刻想到了一个“参照物”——GitHub Copilot。作为目前最流行的AI编程助手,Copilot几乎成了代码生成的代名词。那么,这个新来的、开源的、只有1.7B参数的Qwen3,在代码生成这件事上,到底有几斤几两?它能达到Copilot几成的功力?还是说,它有自己的独特优势? 这篇文章,我就带你一起上手实测,用最直观的方式,看看Qwen3-1.7B在代码生成上的真实表现,

By Ne0inhk

PyCharm+GitHub Copilot零成本配置手册:学生认证/2FA/汉化疑难一次解决

PyCharm + GitHub Copilot 零成本配置手册:从学生认证到流畅编码的全链路实战 作为一名学生开发者,你是否曾羡慕那些能流畅使用AI编程助手的同行,却苦于复杂的认证流程、网络环境的掣肘,或是面对英文界面时的些许不适?将前沿的AI工具无缝融入日常开发工作流,本应是一个提升效率的愉悦过程,而非充满障碍的挑战。今天,我们就来彻底解决这些问题,打造一套专为学生群体设计、开箱即用的PyCharm与GitHub Copilot生产力解决方案。这套方案不仅会手把手带你完成从学生身份验证到IDE集成的每一步,更会聚焦于国内用户常见的“水土不服”问题,提供稳定的替代方案和优化技巧,让你真正零成本、零门槛地拥抱AI辅助编程。 1. 基石构建:GitHub学生认证与账户安全加固 在享受任何福利之前,一个经过验证且安全的GitHub账户是首要前提。学生认证是获取GitHub Copilot Pro免费使用权的钥匙,而双重身份验证(2FA)则是守护这把钥匙的保险箱。 1.1 高效通过GitHub学生认证 学生认证的核心在于向GitHub证明你当前的在读身份。整个过程需要细心,但绝非

By Ne0inhk