【设计模式|上】创建型模式
every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog
0. 前言
设计模式(上):
- 简单工厂模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
- 单例模式
1. 正文
1.1 创建型(Creational Patterns)
1.1.1 简单工厂模式(Simple factory)
说明: 非标准的GoF总结设计的23种设计模式之一,可作为工厂模式的需要解决的问题
'''
simple Factory Method
'''class Shape(object):'''父类'''def draw(self):raise NotImplementedErrorclass Circle(Shape):'''Shape子类'''def draw(self):print('draw circle')class Rectangle(Shape):'''Shape的子类'''def draw(self):print('draw Rectangle')class ShapeFactory(object):'''工厂模式:暴露给用户去调用的,用户可通过该类进行选择Shape的子类进行实例化'''def create(self, shape):if shape == 'Circle':return Circle()elif shape == 'Rectangle':return Rectangle()else:return Nonefac = ShapeFactory() #实例化工厂类
obj = fac.create('Circle') #实例化Shape的Circle子类
obj.draw()
作用: 定义一个用于创建对象的接口,让子类决定实例化哪一个。
场景:
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建对象的时候
- 当类将创建对象的职责委托给多个子类中的某一个
优点: 客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则
1.1.2 工厂方法模式(Factory Method)
案例1:
'''
Factory Method工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)应用。
'''class ShapeFactory(object):'''工厂类'''def getShape(self):return self.shape_nameclass Circle(ShapeFactory):def __init__(self):self.shape_name = "Circle"def draw(self):print('draw circle')class Rectangle(ShapeFactory):def __init__(self):self.shape_name = "Retangle"def draw(self):print('draw Rectangle')class ShapeInterfaceFactory(object):'''接口基类'''def create(self):'''把要创建的工厂对象装配进来'''raise NotImplementedErrorclass ShapeCircle(ShapeInterfaceFactory):# 核心在这里def create(self):return Circle()class ShapeRectangle(ShapeInterfaceFactory):# 核心在这里def create(self):return Rectangle()shape_interface = ShapeCircle()
obj = shape_interface.create()
obj.getShape()
obj.draw()shape_interface2 = ShapeRectangle()
obj2 = shape_interface2.create()
obj2.draw()
核心: ShapeInterfaceFactory(父类 or 基类):提取出所有子类的重复方法代码
案例2:
使用步骤:
- 创建抽象工厂类,定义具体工厂的公共接口;
- 创建抽象产品类 ,定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) ,定义生产的具体产品;
- 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
- 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
# 抽象工厂类
class WeChatFactory(object):def create_wechat(self):pass
# 具体工厂类A(创建账号A)
class AccountAFactory(WeChatFactory):def create_wechat(self):return AccountA()
# 具体工厂类B(创建账号B)
class AccountBFactory(WeChatFactory):def create_wechat(self):return AccountB()
# 抽象产品类(微信账号功能)
class WeChat(object):def send_message(self, content):pass
def send_image(self, imageid):pass
# 具体产品类A(账号A功能)
class AccountA(WeChat):def send_message(self, content):print("使用企业微信账号A推送信息: ", content)
def send_image(self, imageid):print("使用企业微信账号A推送图片: ", imageid)
# 具体产品类B(账号B功能)
class AccountB(WeChat):def send_message(self, content):print("使用企业微信账号B推送信息: ", content)
def send_image(self, imageid):print("使用企业微信账号B推送图片: ", imageid)
if __name__ == "__main__":# 实例化账号Awechat_factory_a = AccountAFactory()# 创建账号A的微信对象wechat1 = wechat_factory_a.create_wechat()# 使用账号A对象发送信息wechat1.send_message(content="haha")wechat1.send_image(imageid="hehe.jpg")
# 实例化账号Bwechat_factory_b = AccountBFactory()# 创建账号B的微信对象wechat2 = wechat_factory_b.create_wechat()# 使用账号B对象发送信息wechat2.send_message(content="heihei")wechat2.send_image(imageid="hehe.jpg")
小结:
有两个类,在类中定义公共接口,在实例化时,一个类中的某一方法作用是实例化另一个类
1.1.3 抽象工厂模式(Abstract Factory)
'''
Abstract Factory
'''class AbstractFactory(object):computer_name = ''def createCpu(self):passdef createMainboard(self):passclass IntelFactory(AbstractFactory):computer_name = 'Intel I7-series computer 'def createCpu(self):return IntelCpu('I7-6500')def createMainboard(self):return IntelMainBoard('Intel-6000')class AmdFactory(AbstractFactory):computer_name = 'Amd 4 computer 'def createCpu(self):return AmdCpu('amd444')def createMainboard(self):return AmdMainBoard('AMD-4000')class AbstractCpu(object):series_name = ''instructions = ''arch=''class IntelCpu(AbstractCpu):def __init__(self,series):self.series_name = seriesclass AmdCpu(AbstractCpu):def __init__(self,series):self.series_name = seriesclass AbstractMainboard(object):series_name = ''class IntelMainBoard(AbstractMainboard):def __init__(self,series):self.series_name = seriesclass AmdMainBoard(AbstractMainboard):def __init__(self,series):self.series_name = seriesclass ComputerEngineer(object):def makeComputer(self,factory_obj):self.prepareHardwares(factory_obj)def prepareHardwares(self,factory_obj):self.cpu = factory_obj.createCpu()self.mainboard = factory_obj.createMainboard()info = '''------- computer [%s] info:cpu: %smainboard: %s-------- End --------'''% (factory_obj.computer_name,self.cpu.series_name,self.mainboard.series_name)print(info)if __name__ == "__main__":engineer = ComputerEngineer() #装机工程师intel_factory = IntelFactory() #intel工厂engineer.makeComputer(intel_factory)amd_factory = AmdFactory() #adm工厂engineer.makeComputer(amd_factory)
- 相比工厂模式,又进了一步,不在工厂中具体实例化类,相当于对工厂进行了抽象。
- 类是对对象的抽象,抽象工厂是对类的抽象。
1.1.4 创建者模式–Builder
解决的问题:
我需要做一个功能,检测出图像中的某些特殊标记。我写了这样一个功能的类,构造它时,传入的是一张拍摄好的图像的fileName。 过了两天,我要把这个功能和其他功能联合起来,我需要的图像就变成了一个数组传入。于是我就加上了一个处理数组数据的构造函数。过了几天,数组又发生了变化,现在图像大小要求可变,没什么难度,新写一个构造函数,包含数组和尺寸。 又过了几天,图像需求又要变了,我之前的图像是三通道的,现在要求,单通道的图像也能处理,嗯,好吧,再加个构造函数。。。。写着写着,我发现上帝也看不懂我的代码了,于是,我就想减少构造函数的复杂度,我找到了Cpp的默认参数的特性,嗯,这样,几个构造函数可以“精巧”的利用默认参数,成功的缩减了构造函数的个数。。。正当我洋洋自得时,情况又变了,有些图像需要特殊的操作,比如强化、锐化或者旋转后,才能使用,为了不影响我类内部的功能实现,我选择在构造时,就可以判断是否需要做特殊操作,于是,我的所有构造函数上就都要加上一个额外的参数—特殊操作参数,ok,我吭哧吭哧的把所有的构造函数都改了,然后,就是函数声明的地方、定义的地方、调用的地方,还记得之前有过的默认参数嘛? 改用这些构造函数,那个酸爽,,,, 每次改之前稳定的代码中的调用的地方,我都要仔细的设计参数,小心翼翼的,改一个,编译一下,跑一下,测试一下结果。 这个时候,发现之前的所谓的“精巧”的设计,简直就是反人类,错一点点都不满足那种精巧了,然后就是铺天盖地的错误。 过了几天,我再回来想看我的代码,发现,脑子里面得把整个思路完全得走一边,才能看懂。没看懂内部逻辑,就别想正确大胆得调用。
事情发展到这个地步,我意识到,我应该去找设计模式了。
来源:https://zhuanlan.zhihu.com/p/58093669 评论
'''
Builder
'''#建造者模式
#相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。
# 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
# 基本思想
# 某类产品的构建由很多复杂组件组成;
# 这些组件中的某些细节不同,构建出的产品表象会略有不同;
# 通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
# 当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。def printInfo(info):print(info)#建造者基类
class PersonBuilder():def BuildHead(self):passdef BuildBody(self):passdef BuildArm(self):passdef BuildLeg(self):pass#胖子
class PersonFatBuilder(PersonBuilder):type = '胖子'def BuildHead(self):printInfo("构建%s的大。。。。。头" % self.type)def BuildBody(self):printInfo("构建%s的身体" % self.type)def BuildArm(self):printInfo("构建%s的手" % self.type)def BuildLeg(self):printInfo("构建%s的脚" % self.type)#瘦子
class PersonThinBuilder(PersonBuilder):type = '瘦子'def BuildHead(self):printInfo("构建%s的头" % self.type)def BuildBody(self):printInfo("构建%s的身体" % self.type)def BuildArm(self):printInfo("构建%s的手" % self.type)def BuildLeg(self):printInfo("构建%s的脚" % self.type)#指挥者
class PersonDirector():pb = None;def __init__(self, pb):self.pb = pbdef CreatePereson(self):self.pb.BuildHead()self.pb.BuildBody()self.pb.BuildArm()self.pb.BuildLeg()def clientUI():pb = PersonThinBuilder()pd = PersonDirector(pb)pd.CreatePereson()pb2 = PersonFatBuilder()#pd = PersonDirector(pb)pd.pb = pb2pd.CreatePereson()returnif __name__ == '__main__':clientUI();
个人理解: 简单来说就是将需要创建的东西,打包放方法里面,方便统一管理调用
1.1.5 原型模式–Prototype
当创建对象成本较高时使用。如:一个对象需要再操作高代价的数据库之后才被创建,那么可以使用已经创建的对象,减少数据库的调用。
通俗理解:
当我们出版了一本书《大话设计模式 1.0版》,若10 年后我们觉得这本书跟不上时代了,这时候需要去重写一本《大话设计模式 2.0版》,那么我们是完全重写一本书呢?还是在原有《大话设计模式 1.0版》的基础上进行修改呢?当然是后者,这样会省去很多排版、添加原有知识等已经做过的工作。
来源:https://juejin.cn/post/7000534811697741832
'''
Prototype
'''import copyclass Prototype:def __init__(self):self._objects = {}def register_object(self, name, obj):"""Register an object"""self._objects[name] = objdef unregister_object(self, name):"""Unregister an object"""del self._objects[name]def clone(self, name, **attr):"""Clone a registered object and update inner attributes dictionary"""obj = copy.deepcopy(self._objects.get(name))obj.__dict__.update(attr)return objdef main():class A:def __str__(self):return "I am A"a = A()prototype = Prototype()prototype.register_object('a', a)b = prototype.clone('a', a=1, b=2, c=3)print(a)print(b.__dict__)print(b)print(b.a, b.b, b.c)if __name__ == '__main__':main()
1.1.6 单例模式–Singleton
适用场景: 保证只有一个实例操作,用于资源调度、日志管理、信息注册等
'''
Singleton
'''**案例1:** 类方式
# 实现__new__方法
# 并在将一个类的实例绑定到类变量_instance上,
# 如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
# 如果cls._instance不为None,直接返回cls._instance
class Singleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):# cls = a = MyClass('Burgess')# 判断是否有a该实例存在,前面是否已经有人实例过,如果内存没有该实例...往下执行# 需要注明该父类的内存空间内最多允许相同名字子类的实例对象存在1个(不可多个)orig = super(Singleton, cls) # farther classcls._instance = orig.__new__(cls)# orig =让cls继承指定的父类 Singleton# cls._instance = 创建了MyClass('Burgess') 该实例# 这两句相当于外面的 a= MyClass('Burgess')return cls._instance # 具体的实例class MyClass(Singleton):def __init__(self, name):self.name = nameclass Nana(Singleton):def __init__(self, name):self.name = namea = MyClass("Burgess")
print(a.name)
b = MyClass("Crystal")
print(a.name)
print(b.name)
b.name = 'xx'
print(a.name)
print(b.name)
案例2: 装饰器
def singleton(cls, *args, **kw): instances = {} def wrapper(): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return wrapper
@singleton
class Animal(object):def __init__(self):passanimal1 = Animal()
animal2 = Animal()
print(id(animal1))
print(id(animal2))
参考
[1] https://refactoring.guru/design-patterns/factory-method
[2] https://zhuanlan.zhihu.com/p/322327467
[3] https://zhuanlan.zhihu.com/p/56202148
[4] https://blog.csdn.net/Burgess_zheng/article/details/86762248#t12
[5] https://zhuanlan.zhihu.com/p/105234299
[6] https://blog.csdn.net/qq_33511971/article/details/110168895
[7] https://www.cnblogs.com/littlefivebolg/p/9929016.html
[8] https://blog.csdn.net/qq_30758629/article/details/105842240
[9] https://blog.csdn.net/qq_40329976/article/details/103963327
[10] https://zhuanlan.zhihu.com/p/58093669
[11] https://blog.csdn.net/huxiaotong_exp/article/details/53981963
[12] https://zhuanlan.zhihu.com/p/591683145
[13] https://www.cnblogs.com/welan/p/9123803.html
[14] https://juejin.cn/post/7000534811697741832
[15] https://www.zhihu.com/tardis/zm/art/87524388?source_id=1005
相关文章:

【设计模式|上】创建型模式
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 设计模式(上): 简单工厂模式工厂模式抽象工厂模式建造者模式单例模式 1. 正文 1.1 创建型(Creational Patterns) …...

【JS】类 class
【JS】类 class 定义类类的方法类继承静态方法 类(class)是用于创建对象的模板。 我们使用 class 关键字来创建一个类,类体在一对大括号 {} 中,我们可以在大括号 {} 中定义类成员的位置,如方法或构造函数。 每个类中…...

Ubuntu安装harbor(http模式)并随便上传一个
Ubuntu安装harbor(http模式) docker和harbor的介绍就免了,都不知道啥东西,还安装搞毛 先安装docker环境 不要问,软件源之类的配置,挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…...

《向量数据库指南》——腾讯云向量数据库Tencent Cloud Vector DB正式上线公测!提供10亿级向量检索能力
8月1日,腾讯云向量数据库(Tencent Cloud Vector DB)已正式上线公测。在腾讯云官网上搜索“向量数据库”,就可以正式体验该产品。 腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、文本图像检索、自然语言处理等 AI 领域。…...

1分钟解决github push/pull报错443
1.打开https://www.ipaddress.com/ 2.复制如图IP地址 3.文件夹打开C:\Windows\System32\drivers\etc,复制hosts文件,粘贴到桌面 4.在桌面用记事本打开复制过来的hosts 5.在末尾加上一行,IP写刚才复制的 6.复制桌面的hosts,粘贴回C:\Window…...

vue3学习-ref引用
模板引用 使用特殊的 refattribute 允许再特定的Dom或组件被挂在后,获取他的直接引用。 import { ref } form vue const input ref(null) <input ref"input"/>注意:只可以在组件挂载后才能访问模板引用 #如果你需要侦听一个模板引用 r…...

Docker 容器转为镜像
# 容器转成镜像并指定镜像名称与版本号 # commit 时原有容器挂载的目录是不会被写入到新的镜像中去的,数据卷相关的都不会生效 # 但是 root 目录下新建的内容会写入到新的镜像中去 $ docker commit 容器ID 新镜像名称:版本号 $ docker commit -m"描述信息"…...

阿里云服务器免费试用及搭建WordPress网站
文章目录 前言一、免费试用1、选择使用产品2、进行产品配置3、远程连接阿里云服务器①、重置实例密码②、SecureCRT 远程链接③、Workbench 远程链接二、搭建 WordPress 网站1、开放搭建 WordPress 需要的端口2、搭建 LAMP 环境①、Linux 系统升级和更新源②、安装 Apache2③、…...

整流二极管型号汇总,超齐全
整流二极管是什么二极管?查看资料可知,整流二极管是一种将交流电能转变为直流电能的半导体器件,可见整流二极管的作用重在“整流”。整流二极管主要用于各种低频半波整流电路,如需达到全波整流需连成整流桥使用。近日,…...

MongoDB 操作命令
创建database 有就切换没有创建 useMydatabase 显示数据库:show dbs显示该database下的 bson对象 show collections 显示该bson下的具体内容**mydatabase.mycollection.find()**查询该bson对象内容**且查询****mydatabase.mycollection.find({a:,b:})****或查询****…...

markdown高级写作技巧汇总
文章目录 1 代码diff2 待办事项3 图片设置宽高4 折叠5 锚点链接实现方式① Markdown 原始写法 [名称](#id)② HTML 语法 名称 6 目录树7 换行 1 代码diff 如果你做过代码 Code Review,对下面这种效果肯定很熟悉 // 数组去重 const unique (arr)>{ - return A…...

SpringBoot自动配置原理入门级理解
简单理解 spring中,我们配置一个bean有两种方式,一种是xml标签的形式,一种是通过java类的形式。那么自动装配就是通过java类的形式来配置bean。 不同的是,springboot将这些我们需要的bean提前配置好了以java类的形式存放在META-I…...

2023 08.02 小记与展望
碎碎念系列更新 算是坚持的第一个月(每个月更新一次,上次是6.29) 主要对上月工作进行总结,并对后续学习内容进行规划。 一、关于工作 7月工作主要涉及以下方面: 1、公司自研APP维护(主要是接口更新和修改…...

MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术
我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标:它们以软件开发商和供应商为目标,网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…...

蓝桥杯上岸每日N题 第六期(求阶乘)!!!
蓝桥杯上岸每日N题第六期 ❗️ ❗️ ❗️ 同步收录 👇 蓝桥杯上岸必背!!!(持续更新中~) 大家好 我是寸铁💪 冲刺蓝桥杯省一模板大全来啦 🔥 蓝桥杯4月8号就要开始了 🙏 距离蓝桥杯省赛倒数…...

Codeforces Round 889 (Div. 2)(视频讲解A——D)
文章目录 A Dalton the TeacherB Longest Divisors IntervalC2 Dual (hard Version)D Earn or Unlock Codeforces Round 889 (Div. 2)(视频讲解A——D) A Dalton the Teacher #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f us…...

K8s安全配置:CIS基准与kube-bench工具
01、概述 K8s集群往往会因为配置不当导致存在入侵风险,如K8S组件的未授权访问、容器逃逸和横向攻击等。为了保护K8s集群的安全,我们必须仔细检查安全配置。 CIS Kubernetes基准提供了集群安全配置的最佳实践,主要聚焦在两个方面:主…...

linux安装python和部署Django项目
文章目录 1 python安装2 Django项目部署 1 python安装 官网地址:https://www.python.org/ 本次下载的python安装包地址:https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz 解压下载的python压缩包 [rootlocalhost software]# tar -zxvf P…...

00-Hadoop入门
Hadoop入门 Hadoop四高 1)高可靠性 Hadoop底层维护多个数据副本,所有即使hadoop某个计算元素或存储故障,也不会造成数据丢失 2)高扩展性 在集群间分配任务数据,可方便的扩展数以千计的节点 3)高效性 …...

SE-Net注意力机制详解
📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…...

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c bbc
 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、R…...

推理加速 --- torch.compile
推理加速-- torch.compile 一、背景介绍1.2 首次推理速度慢1.3 推理多次之后,又会出现一次速度特别慢的情况,感觉好像是重新优化 二、如何使用三、其他设置3.1 mode 设置3.2 backend3.3 fullgraph3.4 dynamic 参考资料 一、背景介绍 PyTorch 2.0 官宣了…...

JS-----数据结构与算法(2)
目录 三. 栈结构 1.认识栈结构 2. 封装栈结构 3. 应用 3-1 十进制转二进制 3-2 进制转换法 四. 队列 1.队列是什么? 2.队列的封装 3. 队列的应用-击鼓传花 4. 双端队列 5.判断是否为回文 三. 栈结构 1.认识栈结构 栈(stack)又…...

手把手安装TomCat;并部署JPress
目录 一、了解Tomcat: 二、安装 1、获取Tomcat软件包,且需要Java环境。 2、安装jdk 3、安装Tomcat 1.解压并创建软链接: 2.创建启动用户并更改文件权限: 3.编写系统服务文件: 4.重新加载配置文件并启动tomcat…...

tensorflow1.13分布式训练 参考资料 -教程原理
前言 对于数据量较大的时候,通过分布式训练可以加速训练。相比于单机单卡、单机多卡只需要用with tf.device(‘/gpu:0’)来指定GPU进行计算的情况,分布式训练因为涉及到多台机器之间的分工交互,所以更麻烦一些。本文简单介绍了多机(单卡/多卡…...

DP学习第五篇之礼物的最大价值
DP学习第五篇之礼物的最大价值 剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode) 一.题目解析 二. 算法原理 状态表示 tips: 经验题目要求。以[i,j]位置为结尾,。。。 dp[i][j]: 到达[i, j]位置时,此时的最大礼物价值 状态转移…...

cURL error 1: Protocol “https“ not supported or disabled in libcurl
1、php项目composer update报错 2、curl -V检查 发现curl已经支持了https了 3、php版本检查 4、php插件检查 插件也已经含有openssl组件了 5、phpinfo检查 curl是否开启ssl 定位到问题所在,php7.4的 curl扩展不支持 https 需要重装 php7.4的curl扩展 6、curl下载 下…...

XCode升级后QT无法编译的问题
原因是SDK的版本变了,Qt配置的版本要修改。 解决办法如下: 1.找到 /Users/*/Qt/5.15.2/clang_64/mkspecsqdevice.pri 这个文件打开编辑, 在文件末尾追加一句 !host_build:QMAKE_MAC_SDKmacosx13.1 至于这个版本号13.1是怎么来的呢࿱…...

springboot编写mp4视频播放接口
简单粗暴方式 直接读取指定文件,用文件流读取视频文件,输出到响应中 GetMapping("/display1/{fileName}")public void displayMp41(HttpServletRequest request, HttpServletResponse response,PathVariable("fileName") String fi…...

华为OD机试真题 JavaScript 实现【机器人活动区域】【2023Q1 200分】,附详细解题思路
目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试&am…...