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

结构型模式-python版

在21种设计模式中, 结构型设计模式有7种, 分别是:

  • 适配器模式
  • 代理模式
  • 桥接模式
  • 享元模式
  • 外观模式
  • 组合模式
  • 装饰器模式

下面逐一简要介绍:

1 适配器模式

适配器(Adapter)设计模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁,使得它们可以一起工作,而无需修改它们的源代码。

在这里插入图片描述主要角色:
目标接口(Target): 定义客户端使用的接口,客户端通过该接口与适配器进行交互。

适配器(Adapter): 实现目标接口,并且持有一个被适配者的实例,将客户端的请求转换为被适配者能够处理的形式。

被适配者(Adaptee): 拥有一组不兼容目标接口的方法,适配器通过包装被适配者,使其能够与目标接口协同工作。

客户端(Client): 通过目标接口与适配器进行交互,无需直接与被适配者打交道。

1.1 代码举例

from abc import ABC, abstractmethod# 目标接口
class EnglishSpeaker(ABC):@abstractmethoddef speak_english(self):pass# 被适配者
class FrenchSpeaker:def parler_francais(self):return "Je parle français"# 适配器
class FrenchToEnglishAdapter(EnglishSpeaker):def __init__(self, french_speaker):self.french_speaker = french_speakerdef speak_english(self):french_phrase = self.french_speaker.parler_francais()# 这里可以进行一些转换操作,这里简单地将法语短语翻译成英语english_translation = "I speak English: " + french_phrasereturn english_translation# 客户端
def communicate_in_english(english_speaker):print(english_speaker.speak_english())# 创建被适配者
french_speaker = FrenchSpeaker()# 创建适配器
adapter = FrenchToEnglishAdapter(french_speaker)# 客户端调用
communicate_in_english(adapter)

1.2 适配器模式的优缺点

优点
(1)提高了类的复用性
通过适配器模式,原本不兼容的类可以被一起使用,避免了重写代码的需求,从而提高了代码的复用性。

(2)灵活性和扩展性
可以通过编写新的适配器,轻松地将现有类与新接口或新系统集成在一起,增加系统的灵活性和扩展性。

(3)遵循开闭原则
适配器模式允许扩展系统而不改变现有的代码结构,符合面向对象设计的开闭原则(对扩展开放,对修改关闭)。

(4)解耦
适配器模式将客户端与被适配的类解耦,使客户端不需要关心被适配类的接口细节,只需要使用适配器提供的接口。

缺点
(1)增加了系统的复杂性
如果过度使用适配器模式,可能会导致系统中出现大量的适配器类,增加了代码的复杂性和维护难度。

(2)性能开销
由于适配器模式涉及对象的间接调用,可能会导致一定的性能开销,特别是在高性能要求的系统中。

(3)可能会掩盖真实的系统设计缺陷
适配器模式虽然解决了接口不兼容的问题,但它可能会掩盖一些设计上的问题。如果系统设计时能够提前规划好接口,这样的适配可能本不需要。

(4)可能影响代码的可读性
引入适配器后,系统的结构变得更加复杂,可能会让代码的可读性下降,特别是对于不熟悉这种模式的开发人员。

2 代理模式

Python代理模式(Proxy Pattern)是一种结构型设计模式。在代理模式中,代理对象充当了另一个对象的占位符,以控制对该对象的访问。

代理对象和被代理对象实现了相同的接口,因此它们可以互相替代。客户端和代理对象之间的交互是无缝的,因为它们的接口是一样的。

代理模式的主要功能是为其他对象提供一个代理,以控制对对象的访问。代理对象可以在调用被代理对象之前或之后执行一些操作,例如身份验证,缓存等。

在这里插入图片描述
主要角色:
Subject类:通过接口或抽象类声明真实角色实现的业务方法。
Proxy类:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
RealSubject:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

2.1 代码举例

from abc import abstractmethod, ABCMetaclass Subject(metaclass=ABCMeta):@abstractmethoddef Request(self):passclass RealSubject(Subject):def Request(self):print("Receive a request")class Proxy(Subject):def __init__(self):self.subject = Nonedef Request(self):self.subject = RealSubject()self.subject.Request()class Client(object):def main(self):p = Proxy()p.Request()if __name__ == '__main__':Client().main()

2.2 代理模式的优缺点

优点
(1)保护了真实对象的访问,可以对访问进行限制和控制;
(2)可以提高访问效率,通过代理对象可以缓存数据或者调用其他服务等;
(3)可以提高系统的灵活性,因为代理对象可以在不影响真实对象的情况下扩展其功能。

缺点

(1)可能引入额外的复杂性,因为需要创建代理对象。
(2)如果代理对象没有正确实现与真实对象相同的接口,可能会导致客户端代码无法正常工作。

3 桥接模式

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
通俗点讲就是在不同的地方之间搭一座桥,让他们连接起来,可以相互通讯和使用。
在模式中,就是为被分离了的抽象部分和实现部分来搭桥。
桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用实现部分的对象,而不能反过来,也就是个单向桥。

在这里插入图片描述
主要角色:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。

修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。

实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现

什么场景下会用到桥接模式? https://www.cnblogs.com/baxianhua/p/11358707.html 中给出了一个形象化的例子, 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等
是对于每个图形都提供一个颜色的版本, 还是将图形和颜色组合起来使用, 显然后一种更为合适, 对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。

3.1 代码举例

from abc import ABC, abstractmethod# 接口实现类
class Implementor(ABC):@abstractmethoddef Operation(self):raise NotImplementedErrorclass ConcreteImplementorA(Implementor):def Operation(self):print("实现 A的方法")class ConcreteImplementorB(Implementor):def Operation(self):print("实现 B的方法")# 抽象类
class Abstraction(ABC):def __init__(self, implementor):self.implementor = implementor@abstractmethoddef Operation(self):raise NotImplementedErrorclass RefineAbstraction(Abstraction):def Operation(self):self.implementor.Operation()if __name__ == "__main__":a = ConcreteImplementorA()b = ConcreteImplementorB()aa = RefineAbstraction(a)ab = RefineAbstraction(b)aa.Operation()ab.Operation()

3.2 桥接模式的优缺点

优点
(1)分离抽象接口及其实现部分。
(2)桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
(3)桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
(4)实现细节对客户透明,可以对用户隐藏实现细节。

缺点
(1)桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

4 享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建对象的数量,以提高应用程序的性能。享元模式通过共享尽可能多的数据来减少内存使用。

在这里插入图片描述
主要角色:
抽象享元角色(FlyWeight):享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现;
具体享元角色(ConcreteFlyWeight):实现抽象享元类中的方法,是需要共享的对象类
享元工厂(FlyWeightFactory):维护一个享元对象的池,内部使用一个 Map 存储已经创建的享元对象

4.1 代码举例

from abc import abstractmethod, ABCMeta# 抽象享元类
class Flyweight(metaclass=ABCMeta):@abstractmethoddef operation(self):pass# 具体享元类,实现了Flyweight
class ConcreteFlyweight(Flyweight):def __init__(self, name):self.name = namedef operation(self):print("Name: %s" % self.name)# 享元创建工厂类
class FlyweightFactory():_dict = {}def getFlyweight(self, name):if name not in self._dict:self._dict[name] = ConcreteFlyweight(name)return self._dict[name]def getFlyweightCount(self):return len(self._dict)class Client(object):def main(self):factory = FlyweightFactory()c1_capp = factory.getFlyweight("cappuccino")c1_capp.operation()c2_mocha = factory.getFlyweight("mocha")c2_mocha.operation()c3_capp = factory.getFlyweight("cappuccino")c3_capp.operation()print("Num of Flyweight Instance: %s" % factory.getFlyweightCount())if __name__ == "__main__":Client().main()

4.2 享元模式的优缺点

优点:
(1)减少内存使用。
(2)提高程序性能。
(3)对象共享可以降低程序的复杂度。
缺点:
(1)可能会导致代码复杂性增加。
(2)缓存的数据可能过多,导致需要更多的内存。
应用场景:
(1)有大量的相似对象需要创建。
(2)对象的大部分属性可以共享,相对稳定。
(3)需要缓存数据的应用程序。

5 外观模式

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口。类似现实世界中的电脑,开机按钮可以说就是一个简单的调用接口,帮用户屏蔽了复杂的内部电路。

在这里插入图片描述

5.1 代码举例

class AirConditioner:def on(self):print("Air Conditioner is on.")def off(self):print("Air Conditioner is off.")class WaterHeater:def on(self):print("Water Heater is on.")def off(self):print("Water Heater is off.")class Curtains:def open(self):print("Curtains are open.")def close(self):print("Curtains are closed.")class Humidifier:def on(self):print("Humidifier is on.")def off(self):print("Humidifier is off.")class SmartHomeFacade:def __init__(self, air_conditioner, water_heater, curtains, humidifier):self.air_conditioner = air_conditionerself.water_heater = water_heaterself.curtains = curtainsself.humidifier = humidifierdef arrive_home(self):print("Arriving home...")self.air_conditioner.on()self.water_heater.on()self.curtains.open()self.humidifier.on()def leave_home(self):print("Leaving home...")self.air_conditioner.off()self.water_heater.off()self.curtains.close()self.humidifier.off()if __name__ == "__main__":air_conditioner = AirConditioner()water_heater = WaterHeater()curtains = Curtains()humidifier = Humidifier()smart_home = SmartHomeFacade(air_conditioner, water_heater, curtains, humidifier)smart_home.arrive_home()smart_home.leave_home()

5.2 外观模式的优缺点

优点:
(1)实现了子系统与客户端之间的松耦合关系。

(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

(3)这其实也是Python一直提倡的封装思想,隐藏一些丑陋的系统,提供API去调用,不用管内部如何实现,只需调用API即可实现相关功能。

缺点:

(1)不能很好地限制客户使用子系统类
(2)在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

6 组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和对象组合。组合模式的适用场景表示部分-整体层次结构:当需要表示对象的部分-整体层次结构时,可以使用组合模式。统一处理单个对象和组合对象:当需要统一处理单个对象和组合对象时,可以使用组合模式。构建递归结构:当需要构建递归结构(如树形结构)时,可以使用组合模式。

在这里插入图片描述
主要角色:
组件(Component):定义对象的接口,并实现一些默认行为。声明一个接口,用于访问和管理Leaf和Composite中的子组件。
叶子(Leaf):代表树的叶子节点,叶子节点没有子节点。
组合(Composite):定义有子部件的那些部件的行为,存储子部件。并在组件接口中实现与子部件有关的操作,如添加、删除等

6.1 代码举例

from abc import ABC, abstractmethodclass Graphic(ABC):@abstractmethoddef draw(self):passdef add(self, graphic):raise NotImplementedError("This method is not supported")def remove(self, graphic):raise NotImplementedError("This method is not supported")def get_child(self, index):raise NotImplementedError("This method is not supported")class Circle(Graphic):def draw(self):print("Drawing a circle")class Square(Graphic):def draw(self):print("Drawing a square")class CompositeGraphic(Graphic):def __init__(self):self.children = []def draw(self):for child in self.children:child.draw()def add(self, graphic):self.children.append(graphic)def remove(self, graphic):self.children.remove(graphic)def get_child(self, index):return self.children[index]def main():# 创建叶子节点circle1 = Circle()circle2 = Circle()square1 = Square()# 创建组合节点composite1 = CompositeGraphic()composite2 = CompositeGraphic()# 组合图形composite1.add(circle1)composite1.add(circle2)composite2.add(square1)composite2.add(composite1)# 绘制组合图形composite2.draw()if __name__ == "__main__":main()

6.2 组合模式的优缺点

优点
(1)统一处理单个对象和组合对象:组合模式使得客户端可以统一地处理单个对象和对象组合,提高了代码的灵活性和可扩展性。
(2)简化客户端代码:客户端代码可以一致地使用组件接口,而不需要关心处理的是单个对象还是组合对象。
(3)符合开闭原则:可以通过增加新的叶子和组合类来扩展系统,而不需要修改现有代码。

缺点
(1)增加复杂性:组合模式会增加系统中类和对象的数量,可能会使系统变得复杂。
(2)难以限制组合层次:有时需要对组合层次进行限制,但组合模式本身没有提供这样的机制。

7 装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许将行为动态添加到一个对象中,而不必改变该对象的类。这种模式利用了组合的方式,以在运行时动态地添加功能,同时避免了静态类继承的缺点。

装饰器模式的基本思想是:将一个对象“包装”在另一个对象中,从而实现增强原有对象的功能,而不改变原有对象的结构。这种方式可以让我们通过添加新的装饰器来动态地改变对象的行为,而无需对其进行修改。

装饰器模式的实现通常涉及创建一个抽象的装饰器类和一个具体的装饰器类,这个具体的装饰器类可以添加额外的行为或修改对象的行为。同时,还需要创建一个具体的组件类,它是被装饰的对象。最终,装饰器模式将组件类和装饰器类组合起来,以实现动态添加功能的目的。

装饰器模式常常应用于需要动态添加功能或修改对象行为的场景,例如在不改变现有代码的情况下为一个类添加新的功能,或在运行时添加日志、缓存等功能。

7.1 代码举例

def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()

7.2 装饰器模式的优缺点

优点

(1)增强对象功能:装饰器模式可以增强一个对象的功能,而不需要修改原始对象的代码。通过添加不同的装饰器,可以在运行时为对象增加不同的功能,从而满足不同的需求。

(2)可扩展性:装饰器模式非常灵活,允许在运行时动态地添加或删除功能,因此非常适合应对需求的变化。

(3)组合性:装饰器模式允许将多个装饰器组合在一起使用,从而实现更复杂的功能。

(4)单一职责原则:装饰器模式遵循单一职责原则,每个装饰器只关注一个特定的功能,使得代码更加清晰简洁。

(5)开闭原则:装饰器模式遵循开闭原则,可以在不修改原始对象的情况下扩展其功能,从而保证了系统的可维护性和可扩展性。

缺点

(1)增加了代码复杂性:使用装饰器模式会增加代码的复杂度,因为需要创建多个类来实现装饰器。

(2)可能会导致性能问题:由于装饰器是通过递归来实现的,可能会对性能产生一定的影响,尤其是在多层嵌套的情况下。可能会出现装饰器的堆叠问题:当多个装饰器同时应用于同一对象时,可能会出现装饰器的堆叠问题,导致代码变得难以理解和维护。

(3)可能会破坏对象的封装性:使用装饰器模式会暴露对象的内部细节,可能会破坏对象的封装性,导致代码变得不安全和不稳定。

相关文章:

结构型模式-python版

在21种设计模式中, 结构型设计模式有7种, 分别是: 适配器模式代理模式桥接模式享元模式外观模式组合模式装饰器模式 下面逐一简要介绍: 1 适配器模式 适配器(Adapter)设计模式是一种结构型设计模式&…...

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…...

OpenAI澄清:“GPT Next”不是新模型。

不,”GPT Next” 并不是OpenAI的下一个重要项目。 本周早些时候,OpenAI 日本业务的负责人长崎忠男在日本 KDDI 峰会上分享了一场演讲,似乎在暗示一个名为 “GPT Next” 的新模型即将出现。 但OpenAI的一位发言人已向Mashable证实&#xff0…...

<<编码>> 第 10 章 逻辑与开关(Logic and Switches) 示例电路

串联电路 info::操作说明 鼠标单击开关切换开合状态 需要两个开关同时闭合才能接通电路 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch10-01-series-circuit.txt 并联电路 in…...

深入浅出 Ansible 自动化运维:从入门到实战

在现代 IT 运维中,自动化是提升效率、降低错误率的关键。Ansible 作为一款流行的自动化工具,凭借其简洁的语法和强大的功能,成为了运维工程师的得力助手。本文将深入探讨 Ansible 的核心概念、实际应用以及一些实用的技巧,帮助你在…...

一句话描述设计模式

最近在看设计模式,其描述抽象程度令人欲罢不能,始终不得其意。于是尝试用一句话总结了一下,常规的就不说了,只是举了个例子。 单例模式 Spring中的单例bean使用了双重锁机制 工厂模式 Spring中的BeanFactory是简单工厂模式Bea…...

【Linux】Ubuntu 22.04 shell实现MySQL5.7 tar 一键安装

参考 https://blog.csdn.net/qq_35995514/article/details/134350572?spm1001.2014.3001.5501 在原作者基础上做了修改,加了一个删除原有mysql 的脚本 文章目录 一、安装下载**my.cnf 配置文件** 二、执行安装**install_mysql.sh 安装脚本**本机免密脚本 ssh_keyge…...

SQL Server开启网络访问

目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧。 安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…...

el-input设置type=‘number‘和v-model.number的区别

el-input设置typenumber’与设置.number修饰符的区别 1. 设置type‘number’ 使用el-input时想收集数字类型的数据,我们首先会想到typenumber,设置完type为number时会限制我们输入的内容只能为数字,不能为字符/汉字等非数字类型的数值&…...

6.第二阶段x86游戏实战2-理解程序流程

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Netty笔记01-Netty的基本概念与用法

文章目录 1. 概述1.1 Netty 是什么?1.2 Netty 的特点1.3 Netty 的作者1.4 Netty 的地位1.5 Netty 的优势1.6 Netty 的工作原理1.7 Netty 的应用场景1.8 Netty 的重要组件 2. 第一个程序2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理💡 提示 1. 概述 1.1 …...

OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解

鸿蒙开发往期必看: 一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发! “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…...

QT使用事件事件和绘制事件实现简易时钟

这个时钟实现的底层原理主要是利用 Qt 的绘图机制和定时器。首先,设置固定大小的窗口,创建定时器并连接到槽函数,定时器每秒钟触发一次,触发窗口重绘。在paintEvent函数中,使用QPainter进行绘图,绘制圆形表…...

kubeadm方式安装k8s

一、安装环境 环境准备:(有阿里云)centos7 k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts…...

如何使用go生成可执行文件

在 Go 中生成可执行文件非常简单。你可以使用 go build或者go install 命令。以下是步骤: 1. 步骤 1.1. 打开终端,导航到你的 Go 项目目录 确保你在包含 main 包的目录中,通常这是项目的根目录或包含 main.go 文件的目录。 1.2. 运行 go …...

手写Promise

构造器的实现 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejectedclass MyPromise{#state PENDING;#result undefined;constructor(executor){const resolve (data) > {this.#changeState(FULFILLED, data);};const reject (reason) > …...

深度学习云服务器免费使用教程

#云服务器# #深度学习# #人工智能# #计算机视觉# 本文为各位学习深度学习的入门选手而创建,降低深度学习的入门门槛。 谷歌云服务器Colab: T4GPU。限额,需要科学上网,不能使用终端。 谷歌云服务器地址:欢迎使用 C…...

使用ansible的剧本制作salt-master与salt-minion的安装与启动服务过程

虚拟机版本:Rocky Linux release 8.6 (Green Obsidian) 准备几台虚拟机 ipv4地址主机名192.168.137.13center192.168.137.14sp-1192.168.137.15sp-2192.168.137.16sp-3 一、center主机的配置 1.vim /etc/hosts 127.0.0.1 localhost localhost.localdomain loc…...

数据库sqlite3

用数据库函数完成数据的增删改查 增: 将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。 int do_insert(sqlite3 *ppDb) {Worker Work;printf("输入插入的工号:");scanf("%d&qu…...

开发基础之Python 函数(Basic Python Functions for Development)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

Django_Vue3_ElementUI_Release_001_项目初始化

1. 数据库 1.1 安装 https://blog.csdn.net/rbx508780/article/details/127176754 1.2 创建数据库 1.3 DBeaver可视化数据库 https://dbeaver.io/download/ 2 安装Python(3.9.12) 2.1 下载地址 https://www.python.org/downloads/release/python-3912/ 2.2 设定国内源 pip …...

MySQL之安装与基础知识

目录 一:在centos7上安装MySQL数据库 1.卸载默认存在的环境 2.配置mysql的yum源 3. 安装MySQL 4.登录mysql 5.设置MySQL的配置文件 二:MySQL基础知识 1.什么是数据库 2.主流数据库 3.服务器,数据库,表关系及使用案例 4…...

前端基础 | HTML基础:HTML结构,HTML常见标签

文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签:h1–h62.3段落标签:p2.4 换行标签:br2.5格式化标签2.6 图片标签:i…...

宏任务和微任务+超全面试真题

概念 微任务和宏任务是在异步编程中经常使用的概念,用于管理任务的执行顺序和优先级。 宏任务:setTimeout, setInterval,I/O 操作和 UI 渲染等。微任务: Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…...

针对SVM算法初步研究

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝心态决定高度,细节决定成败…...

Java中的`String`不可变性详解

在Java中,String类具有不可变性(immutable),这意味着一旦String对象被创建,它的值将无法更改。所有对字符串的修改操作(如拼接、替换等)实际上都会生成一个新的字符串对象,而不会修改…...

c# SMTP发送邮件

string from ""; string fromAlias "MIS-TC"; string[] to { "" }; string subject "问题提交"; string body sb.ToString(); string ipaddr "smtp.email.qq.com"; int port 25; string credit ""; strin…...

GPU基础 -- 并行化与阿姆达尔定律

并行化与阿姆达尔定律 并行化是将计算任务分割成多个部分,使这些部分能够在多个处理器或核心上同时运行,从而加速任务的完成时间。阿姆达尔定律(Amdahl’s Law)则揭示了并行化所能带来的加速效果的限制。 阿姆达尔定律公式 阿姆…...

Lua热更

Lua 热更 前提 Lua是轻量级,可以解释执行的编程语言、性能好 基本原则 1.场景空 代码控制物体加载释放 2.场景一个 3.节点不手动挂代码 4.AssetsBundle资源管理 5.Lua开发框架 6.调试模式、发布模式 XLua 热更框架 XLua是C#环境下Lua的解决方案 1.Lua虚拟…...

提升汽车行业软件质量:ASPICE培训的关键实践方法

ASPICE(汽车行业软件过程改进和能力确定)培训是一种针对汽车行业软件开发和维护过程的标准化培训。 该培训旨在帮助组织提高其软件开发和维护过程的质量和效率。以下是ASPICE培训的一些最佳实践方法: 1. 理解ASPICE框架:首先&…...