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

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录

  • 1 设计目标
  • 2 Java
    • 2.1 涉及知识点
    • 2.2 实现
      • 2.2.1 实现两个接口飞行为和叫行为
      • 2.2.2 实现Duck抽象基类(把行为接口作为类成员)
      • 2.2.3 实现接口飞行为和叫行为的具体行为
      • 2.2.4 具体实现鸭子
      • 2.2.5 模型调用
  • 3 C++(用到了大量C++2.0的知识)
    • 3.1 涉及知识点
    • 3.2 实现
      • 3.2.1 实现飞行为和叫行为接口
      • 3.2.2 实现Duck基类(使用委托/组合,把指向抽象接口类的指针作为类成员)
      • 3.2.3 实现接口类的飞行为和叫行为
      • 3.2.4 实现具体的鸭子行为
      • 3.2.5 具体调用
  • 4 Python实现
    • 4.1 涉及知识点
    • 4.2 实现代码
      • 4.2.1 实现两个接口飞行为和叫行为
      • 4.2.2 实现Duck抽象基类(把行为接口作为类成员)
      • 4.2.3 实现接口飞行为和叫行为的具体行为
      • 4.2.4 具体实现鸭子
      • 4.2.5 模型调用
  • 5 完整代码
  • 6 其他知识阅读(快速入门)

1 设计目标

此篇为实现篇下,如果对策略者模式不熟,可以看知识点篇上。
在这里插入图片描述
实现要求:鸭子共有三种行为,游泳行为(所有鸭子都会),飞行行为(能飞/不能飞/具有火箭动力的飞行),叫声行为(嘎嘎叫/吱吱叫/什么都不会叫),不同具体鸭子(绿头鸭/模型鸭/…)飞行行为和叫声行为可能不一样。

2 Java

2.1 涉及知识点

  • 接口(interface):定义一种方法约束
  • 继承(extend):子类会具有父类的一般特性也会具有自身的特性,提高代码复用性。

区别:

修饰符不同:接口使用interface修饰,继承使用extends修饰。
多继承方式不同:接口支持多继承,继承只支持单继承。
定义方式不同:接口只能定义全局常量和抽象方法,继承可以定义属性、方法、变量、常量等。
作用不同:接口是一种约束,类实现接口就一定要实现它所有的方法;继承是一种扩展,继承了类,它的私有成员以外的成员变量和成员方法子类都将拥有。
  • 组合(委托):把A类作为B类的成员变量,具体实现在A类中,B类对外暴露调用接口,解耦合。
  • 抽象基类:不能实例化,只能作为类模版,子类需要实现起抽象方法。
  • 构造函数:类的初始化方法。

2.2 实现

2.2.1 实现两个接口飞行为和叫行为

public interface FlyBehavior {public void fly();
}public interface QuackBehavior {public void quack();
}

2.2.2 实现Duck抽象基类(把行为接口作为类成员)

package com.jiangxue.strategy;public abstract class Duck {//组合(委托):策略类作为抽象基类的成员变量QuackBehavior quackBehavior;FlyBehavior flyBehavior;//定义抽象方法:子类必须要实现public abstract void display();//调用类成员的方法public void performQuack(){quackBehavior.quack();;}public void performFly(){flyBehavior.fly();}//所有子类都有的共有行为public void swim(){System.out.println("All ducks float, even decoys");}//setter方法设置鸭子行为(运行时改变行为)public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}
}

2.2.3 实现接口飞行为和叫行为的具体行为

  • 具体实现飞行为接口:
public class FlyWithWings implements FlyBehavior{@Overridepublic void fly(){System.out.println("I'm flying");}
}public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {System.out.println("I can't fly");}
}public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm fly with rocket!");}
}
  • 具体实现叫行为接口:
public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("Quack");}
}public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("<<Silence>>");}
}public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("Squack");}
}

2.2.4 具体实现鸭子

  • 实现绿头鸭
public class MallardDuck extends Duck{//重新构造函数public MallardDuck(){quackBehavior = new Quack();flyBehavior = new FlyWithWings();}public void display(){System.out.println("I'm a real Mallard duck");}
}
  • 实现模型鸭:
public class ModelDuck extends Duck{public ModelDuck(){flyBehavior = new FlyNoWay();quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("I'm a model duck");}
}

2.2.5 模型调用

public class Test {public static void main(String[] args) {//示例1Duck mallardDuck = new MallardDuck();mallardDuck.performQuack();mallardDuck.performFly();//示例2Duck model = new ModelDuck();model.performFly();//改变飞行行为model.setFlyBehavior(new FlyRocketPowered());model.performFly();;    }
}

3 C++(用到了大量C++2.0的知识)

3.1 涉及知识点

  • 纯虚函数(用于实现接口)【virtua和= 0】:在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。有纯虚函数的类是抽象类,不能生成对象,只能派生。
  • virtual析构函数:当父类指针指向子类对象时,执行释放操作,子类对象也会被释放掉。
  • explicit:该构造函数只能显式调用,禁止隐式转换。
  • &&(右值引用):结合了移动语义和完美转发;可以绑定到临时对象。
    • 移动语义:不复制对象,而只是让新的对象名指向原对象名所指对象,并且将原对象所指的置空。
    • 完美转发:可以撰写接受任意参数的函数模版,并将其转发到其他函数,目标函数会接受与其转发函数所接受的完全相同的参数。
  • std::move(把实参强制转换为右值):无条件地右值类型的强制类型转换;
  • std::forward:仅对绑定到右值的引用实施向右值类型的强制转换。
    • 针对右值引用实施std::move,万能引用实施std::forward
  • 智能指针unique_ptr:独占对象,不允许复制;动态管理分配对象的生命周期。
  • make_unique函数:动态分配指定类型的内存,并返回一个指向分配内存的唯一指针。
  • 子类继承父类的构造:不能直接从初始化列表初始化基类成员,应该使用父类的构造函数。
  • 公有继承:基类的公有成员和保护成员的访问属性在派生类中不变

3.2 实现

3.2.1 实现飞行为和叫行为接口

class QuackBehavior{
public://纯虚函数只有函数的名字而不具备函数的功能,不能被调用,要求任何派生类都要定义自己的实现方法//有纯虚函数的类是抽象类,不能生成对象,只能派生。virtual void quack() const = 0;//virtual析构函数好处:当父类指针指向子类对象时,执行释放操作,子类对象也会被释放掉virtual ~QuackBehavior() =default;
};class FlyBehavior{
public:virtual void fly() const = 0;virtual ~FlyBehavior() = default;
};

3.2.2 实现Duck基类(使用委托/组合,把指向抽象接口类的指针作为类成员)

#include <memory>
#include "FlyBehavior.h"
#include "QuackBehavior.h"
#include <iostream>class Duck {
protected://智能指针unique_ptr:独占对象,不允许复制;动态管理分配对象的生命周期std::unique_ptr<FlyBehavior> _flyBehavior;std::unique_ptr<QuackBehavior> _quackBehavior;
public://explicit表示该构造函数只能显式调用,禁止隐式转换。/** 移动语义:不复制对象,而只是让新的对象名指向原对象名所指对象,并且将原对象所指的置空。* 完美转发:可以撰写接受任意参数的函数模版,并将其转发到其他函数,目标函数会接受与其转发函数所接受的完全相同的参数。* &&(右值引用):结合了移动语义和完美转发;可以绑定到临时对象。* std::move(把实参强制转换为右值):无条件地右值类型的强制类型转换;* std::forward:仅对绑定到右值的引用实施向右值类型的强制转换。* 针对右值引用实施std::move,万能引用实施std::forward*/explicit Duck(std::unique_ptr<FlyBehavior> &&flyBehavior ={},std::unique_ptr<QuackBehavior> &&quackBehavior={}):_flyBehavior(std::move(flyBehavior)),_quackBehavior(std::move(quackBehavior)){}//上下文允许在运行时替换策略对象。void setFlyBehavior(std::unique_ptr<FlyBehavior>&&flyBehavior){_flyBehavior = std::move(flyBehavior);}void setQuackBehavior(std::unique_ptr<QuackBehavior>&&quackBehavior){_quackBehavior = std::move(quackBehavior);}//执行飞void performFly() const{_flyBehavior->fly();}//执行叫void performQuack() const{_quackBehavior->quack();}void swim() const{std::cout<<"All ducks float, even decoys"<<std::endl;}virtual void display() const = 0;};

3.2.3 实现接口类的飞行为和叫行为

  • 实现飞行为:
#include <iostream>
#include "FlyBehavior.h"//公有继承:基类的公有成员和保护成员的访问属性在派生类中不变
class FlyWithWings: public FlyBehavior{
public:void fly() const override{std::cout<<"I'm flying"<<std::endl;}
};class FlyNoWay: public FlyBehavior{
public:void fly() const override{std::cout<<"I can't fly"<<std::endl;}
};class FlyRocketPowered : public FlyBehavior{
public:void fly() const override{std::cout<<"I'm fly with rocket!"<<std::endl;}
};
  • 实现叫行为:
#include "QuackBehavior.h"
#include <iostream>class Quack: public QuackBehavior{void quack() const override{std::cout<<"quack"<<std::endl;}
};class MuteQuack : public QuackBehavior{
public:void quack() const override{std::cout<<"<<Silence>>"<<std::endl;}
};class Squeak: public QuackBehavior{void quack() const override{std::cout<<"Squack"<<std::endl;}
};

3.2.4 实现具体的鸭子行为

  • 绿头鸭
#include "Duck.h"
#include "Quack.h"
#include "FlyWithWings.h"
#include <iostream>class MallardDuck : public Duck{
public://子类继承父类的构造//不能直接从初始化列表初始化基类成员,应该使用父类的构造函数explicit MallardDuck(std::unique_ptr<FlyWithWings>&& flyWithWings ={},std::unique_ptr<Quack>&& quack={}): Duck(std::move(flyWithWings), std::move(quack)){}//虚函数方法重写void display() const override{std::cout<<"I'm a real Mallard duck"<<std::endl;}};
  • 模型鸭
#include "Duck.h"
#include "FlyNoWay.h"
#include "Quack.h"class ModelDuck :public Duck{
public:explicit ModelDuck(std::unique_ptr<FlyNoWay>&& flyNoWay,std::unique_ptr<Quack>&& quack): Duck(std::move(flyNoWay), std::move(quack)){}void display() const override{std::cout<<"I'm a model duck"<<std::endl;}};

3.2.5 具体调用

#include "MallardDuck.h"
#include "ModelDuck.h"
#include "FlyRocketPowered.h"void testCode() {//make_unique函数:动态分配指定类型的内存,并返回一个指向分配内存的唯一指针MallardDuck mallardDuck(std::make_unique<FlyWithWings>(),std::make_unique<Quack>());mallardDuck.performQuack();mallardDuck.performFly();ModelDuck modelDuck(std::make_unique<FlyNoWay>(),std::make_unique<Quack>());modelDuck.performFly();modelDuck.setFlyBehavior(std::make_unique<FlyRocketPowered>());modelDuck.performFly();}int main() {testCode();return 0;
}

4 Python实现

4.1 涉及知识点

  • 抽象基类(继承ABC):不能被实例化,只能被继承。
  • 抽象方法(@abstractmethod):继承的子类必须实现的方法。
  • 属性(@property,@flyBehavior.setter):调用时不需要加(),为的是提供更加友好访问类数据的方式。
  • 构造函数(def __init__):初始化类成员变量。
  • 继承(super().__init__):继承父类的属性。
  • from __future__ import annotations:允许你在程序中声明变量或函数的类型,并由编译器或其他工具来检查代码的类型是否正确。有助于提高代码的可读性,并且有助于发现类型错误。

4.2 实现代码

4.2.1 实现两个接口飞行为和叫行为

from abc import ABC, abstractmethod# 抽象基类
class FlyBehavior(ABC):# 抽象方法@abstractmethoddef fly(self):passclass QuackBehavior(ABC):@abstractmethoddef quack(self):pass

4.2.2 实现Duck抽象基类(把行为接口作为类成员)

class Duck(ABC):def __init__(self, flyBehavior: FlyBehavior, quackBehavior: QuackBehavior) -> None:self._flyBehavior = flyBehaviorself._quackBehavior = quackBehavior@abstractmethoddef perform(self) -> None:passdef performFly(self) -> None:return self._flyBehavior.fly()def performQuack(self) -> None:return self._quackBehavior.quack()@propertydef flyBehavior(self) -> FlyBehavior:return self._flyBehavior@propertydef quackBehavior(self) -> QuackBehavior:return self._quackBehavior@flyBehavior.setterdef flyBehavior(self, fly: FlyBehavior) -> None:self._flyBehavior = fly@quackBehavior.setterdef quackBehavior(self, quack: QuackBehavior) -> None:self._quackBehavior = quackdef swim(self) -> None:print("All ducks float, even decoys")

4.2.3 实现接口飞行为和叫行为的具体行为

  • 具体实现飞行为接口:
class FlyWithWings(FlyBehavior):def fly(self) -> None:print("I'm flying")class FlyNoWay(FlyBehavior):def fly(self) -> None:print("I can't fly")class FlyRocketPowered(FlyBehavior):def fly(self) -> None:print("I'm fly with rocket!")
  • 具体实现叫行为接口:
class Quack(QuackBehavior):def quack(self) -> None:print("Quack")class Square(QuackBehavior):def quack(self) -> None:print("Squack")class MuteQuack(QuackBehavior):def quack(self) -> None:print("<<Silence>>")

4.2.4 具体实现鸭子

  • 实现绿头鸭
class ModelDuck(Duck):def __init__(self, flyBehavior: FlyNoWay, quackBehavior: Quack) -> None:super().__init__(flyBehavior, quackBehavior)# 下面的初始化方法,并不能继承父类的属性# _flyBehavior = flyBehavior# _quackBehavior = quackBehaviordef perform(self) -> None:print("I'm a model duck")
  • 实现模型鸭:
class MallardDuck(Duck):def __int__(self, flyBehavior: FlyWithWings, quackBehavior: Quack) -> None:super().__init__(flyBehavior, quackBehavior)def perform(self) -> None:print("I'm a real Mallard duck")

4.2.5 模型调用

# import sys , os
# base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# sys.path.append(base_dir)
# 没有把当前项目加入到PYTHONPATH环境变量from Strategy.duck import *if __name__ == "__main__":mallardDuck = MallardDuck(FlyWithWings(), Quack())mallardDuck.performQuack()mallardDuck.performFly()modelDuck = ModelDuck(FlyNoWay(), Quack())modelDuck.performFly()modelDuck.flyBehavior = FlyRocketPowered()modelDuck.performFly()

5 完整代码

完整的实现代码,见Gitee仓库。如果对您有用的话,欢迎留下star,谢谢。

6 其他知识阅读(快速入门)

Java快速入门
Python快速入门
深入了解C++2.0

相关文章:

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类&#xff08;把行为接口作为类成员&#xff09;2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C&#xff08;用到了大量C2.0的知识&…...

vue2/Vue3项目中,通过请求接口来刷新列表中的某个字段(如:Axios)

vue2/Vue3项目中&#xff0c;通过请求接口来刷新列表中的某个字段。可以使用 Vue 的异步请求库&#xff08;如 Axios&#xff09;来发送请求&#xff0c;并在请求成功后更新相应的字段。 示例如下&#xff08;Vue2&#xff09;&#xff1a; 简单的示例如下&#xff0c;假设列…...

Java多线程锁定

前言 利用多线程编程虽然能极大地提升运行效率&#xff0c;但是多线程本身的不稳定也会带来一系列的问题&#xff0c;其中最经典莫过于售票问题&#xff1b;这时就需要人为地加以限制和干涉已解决问题&#xff0c;譬如今日之主题——锁定。 锁定是我们在多线程中用来解决售票…...

【C 数据结构】单链表

文章目录 【 1. 基本原理 】1.1 链表的节点1.2 头指针、头节点、首元节点 【 2. 链表的创建 】2.0 创建1个空链表&#xff08;仅有头节点&#xff09;2.1 创建单链表&#xff08;头插入法&#xff09;*2.2 创建单链表&#xff08;尾插入法&#xff09; 【 3. 链表插入元素 】【…...

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

文章目录 获取资源从源码构建从CDN获取获取扩展插件 创建项目创建控件创建Blazor组件初始化保存销毁编写渲染逻辑 实现只读/编辑功能切换模式获取只读模式状态响应切换事件 实现明/暗主题切换项目地址 Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它由CodeX…...

Spring Boot | Spring Boot 整合 “Servlet三大组件“ ( Servlet / Filter / Listene )

目录: Spring Boot 整合 "Servlet三大组件" &#xff1a;1. 使用 "组件注册" 的方式 "整合Servlet三大组件" ( 实际操作为 : 创建自定义的"三大组件"对象 结合刚创建"的自定义组件对象"来 将 XxxRegistrationBean对象 通过…...

错误分析 (Machine Learning研习十九)

错误分析 您将探索数据准备选项&#xff0c;尝试多个模型&#xff0c;筛选出最佳模型&#xff0c;使用 Grid SearchCV微调其超参数&#xff0c;并尽可能实现自动化。在此&#xff0c;我们假设您已经找到了一个有前途的模型&#xff0c;并希望找到改进它的方法。其中一种方法就…...

SQL系统函数知识点梳理(Oracle)

这里写目录标题 函数系统函数转换函数to_date()to_char()将数值转换成字符格式 添加货币符号将日期转换成字符 其他不常用的转换函数 字符型函数连接函数大小写转换函数大写转换小写转换首字母大写&#xff0c;其余的小写 替换函数去除空格函数截取函数填充函数获取字符长度函数…...

面试突击---MySQL索引

面试突击---MYSQL索引 面试表达技巧&#xff1a;1、谈一下你对于mysql索引的理解&#xff1f;&#xff08;为什么mysql要选择B树来存储索引&#xff09;2、索引有哪些分类&#xff1f;3、聚簇索引与非聚簇索引4、回表、索引覆盖、最左匹配原则、索引下推&#xff08;1&#xff…...

关注 | 我国已对百种产品实施强制性产品认证

市场监管总局在7日举行的新闻发布会上介绍&#xff0c;该局日前发布《市场监管总局关于对商用燃气燃烧器具等产品实施强制性产品认证管理的公告》&#xff0c;对具有较高安全风险的商用燃气燃烧器具、阻燃电线电缆、电子坐便器、电动自行车乘员头盔、可燃气体探测报警产品、水性…...

虚幻引擎架构自动化及蓝图编辑器高级开发进修班

课程名称&#xff1a;虚幻引擎架构自动化及蓝图编辑器高级开发进修班 课程介绍 大家好 我们即将推出一套课程 自动化系统开发。 自动化技术在项目开发的前中后期都大量运用。如何您是一家游戏公司&#xff0c;做的是网络游戏&#xff0c;是不是经常会遇到程序员打包加部署需…...

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…...

华为海思数字芯片设计笔试第六套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…...

重绘和重排:概念、区别和应用示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…...

创建k8s deploy yaml文件的imagePullSecrets语句

镜像仓库是harbor kubectl create secret docker-registry key --docker-server192.168.0.190 --docker-usernameadmin --docker-passwordHarbor12345...

大模型预测结果导入到Doccano,人工修正预测不准的数据

背景 使用大语言模型做实体识别的实验时&#xff0c;发现大模型关于实体的边界预测一直不准。 主要原因在于当时找了很多同学标注数据&#xff0c;由于不同组同学关于实体的边界没有统一&#xff0c;故导致数据集中实体边界也没统一。 &#xff08;找太多人标&#xff0c;会有…...

python三方库_ciscoconfparse学习笔记

文章目录 介绍使用基本原理父子关系 属性ioscfg 获取配置信息,返回列表is_config_line 判断是否是配置行is_intf 判断IOSCfgLine是不是interfaceis_subintf 判断IOSCfgLine是不是子接口lineage 不知道用法is_ethernet_intf 判断IOSCfgLine是否是以太网接口is_loopback_intf 判断…...

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…...

python创建word文档并向word中写数据

一、docx库的安装方法 python创建word文档需要用到docx库&#xff0c;安装命令如下&#xff1a; pip install python-docx 注意&#xff0c;安装的是python-docx。 二、使用方法 使用方法有很多&#xff0c;这里只介绍创建文档并向文档中写入数据。 import docxmydocdocx.Do…...

MongoDB的安装配置及使用

文章目录 前言一、MongoDB的下载、安装、配置二、检验MongoDB是否安装成功三、Navicat 操作MongoDB四、创建一个集合&#xff0c;存放三个文档总结 前言 本文内容&#xff1a; &#x1f4ab; MongoDB的下载、安装、配置 &#x1f4ab; 检验MongoDB是否安装成功 ❤️ Navicat 操…...

LiteFlow实战:如何用组件化思维重构复杂业务流程

1. 为什么需要组件化思维重构复杂业务流程 在传统的软件开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个业务流程变得越来越复杂&#xff0c;代码逐渐演变成难以维护的"面条式"代码。特别是在电商系统中&#xff0c;像订单处理、价格计算这样的核心流程…...

别只盯着证书!软考软件评测师里,这些‘隐藏’知识点才是你面试的加分项

别只盯着证书&#xff01;软考软件评测师里&#xff0c;这些‘隐藏’知识点才是你面试的加分项 当大多数考生还在死记硬背测试理论时&#xff0c;真正的职场赢家早已把目光投向考纲背后那些能直接转化为面试亮点的实战技能。软件评测师考试中&#xff0c;至少有30%的内容被应试…...

Unity3D RPG游戏开发:从零搭建一个完整的战斗系统(含NavMesh实战)

Unity3D RPG游戏战斗系统深度实战&#xff1a;从NavMesh到技能连招 在独立游戏开发领域&#xff0c;RPG战斗系统的实现质量往往决定了游戏的核心体验。不同于平台跳跃或射击游戏的即时反馈&#xff0c;RPG战斗需要平衡策略性、操作感和数值成长——这正是许多开发者面临的挑战。…...

YOLOv8模型训练脚本打包成exe?小心这个RuntimeError坑,附PyInstaller避坑指南

YOLOv8模型打包实战&#xff1a;从RuntimeError解决到PyInstaller高级配置 在计算机视觉项目的实际部署中&#xff0c;将训练好的YOLOv8模型或训练脚本打包成独立的Windows可执行文件&#xff08;.exe&#xff09;是许多开发者的刚需。这不仅能简化部署流程&#xff0c;还能保护…...

图解稀疏矩阵存储:从CSR行压缩到CSC列压缩的底层实现原理

图解稀疏矩阵存储&#xff1a;从CSR行压缩到CSC列压缩的底层实现原理 稀疏矩阵处理是现代计算科学中的核心问题之一。当矩阵中超过90%的元素为零时&#xff0c;传统的密集存储方式会浪费大量内存空间和计算资源。本文将深入解析三种主流稀疏矩阵存储格式——COO、CSR和CSC的底层…...

基于springboot大学生房屋租赁系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…...

深入浅出QSPI:从SPI协议演进到Flash控制器设计的那些“坑”与最佳实践

深入浅出QSPI&#xff1a;从SPI协议演进到Flash控制器设计的那些“坑”与最佳实践 在嵌入式系统设计中&#xff0c;存储器的访问效率往往成为性能瓶颈的关键所在。当工程师们从传统的并行NOR Flash转向串行Flash解决方案时&#xff0c;QSPI&#xff08;Quad SPI&#xff09;技术…...

WuliArt Qwen-Image Turbo入门实战:用Qwen-Image Turbo生成LOGO初稿

WuliArt Qwen-Image Turbo入门实战&#xff1a;用Qwen-Image Turbo生成LOGO初稿 想快速设计一个LOGO&#xff0c;但没灵感、没时间、也没预算请设计师&#xff1f;今天&#xff0c;我们来试试一个全新的解决方案&#xff1a;用AI文生图模型&#xff0c;几分钟内生成高质量的LO…...

PyTorch 2.6实战技巧:修改strip_optimizer函数解决加载错误

PyTorch 2.6实战技巧&#xff1a;修改strip_optimizer函数解决加载错误 1. 问题背景与现象 1.1 常见错误场景 当你在PyTorch 2.6及以上版本中训练YOLO系列模型时&#xff0c;可能会遇到这样的错误提示&#xff1a; RuntimeError: unsupported operation: ultralytics.nn.ta…...

3阶准均匀B样条曲线在车辆路径规划中的高效应用

1. 为什么3阶准均匀B样条曲线适合车辆路径规划 第一次接触B样条曲线时&#xff0c;我完全被各种数学公式绕晕了。直到在自动驾驶项目中实际应用后才发现&#xff0c;3阶准均匀B样条曲线简直是路径规划的"黄金标准"。想象一下开车时方向盘的操作——既不能像折线那样突…...