适配器模式:C++设计模式中的瑞士军刀
适配器模式揭秘:C++设计模式中的瑞士军刀
- 引言
- 设计模式的重要性
- 适配器模式简介与应用场景
- 适配器模式在现代软件设计中的地位与价值
- 适配器模式基本概念
- 适配器模式的定义与核心思想
- 类适配器与对象适配器的比较
- 设计原则与适配器模式的关系
- 类适配器实现
- 类适配器模式的UML图
- 类适配器模式的实现步骤
- 类适配器模式的示例代码与解析
- 适配器模式的应用场景
- 软件库与组件之间的兼容性
- 基于不同硬件平台的统一接口设计
- 异构系统之间的通信与协同
- 适配器模式的优缺点
- 适配器模式的优势:
- 适配器模式的局限性与不适用场景:
- 适配器模式在实际项目中的应用
- 开发跨平台的图形用户界面库:
- 搭建不同数据库系统间的数据迁移工具:
- 开发统一的硬件驱动接口与设备访问层:
- 适配器模式与其他设计模式的关联
- 适配器模式与装饰器模式的比较:
- 适配器模式与桥接模式的比较:
- 适配器模式与外观模式的比较:
- 适配器模式在C++中的应用领域
- 为什么要用适配器模式?
- 未来展望
- 适配器模式在软件设计中的优势
- 设计模式的发展趋势与前景
- 结语
引言
设计模式的重要性
设计模式是软件设计中经过时间验证的解决方案,它们在处理通用问题时提供了一套有用的方法。设计模式有助于提高代码的可读性、可维护性和可扩展性,同时可以降低开发过程中的复杂度。通过掌握并应用设计模式,程序员能够编写出更加优雅和高效的代码,从而提高软件质量和开发效率。
适配器模式简介与应用场景
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口与另一个接口进行匹配,使原本因接口不兼容而无法一起工作的类能够协同工作。适配器模式通常在以下应用场景中使用:
- 当需要将一个已有的类与其它系统或接口集成时,但无法修改原有类的代码。
- 当需要在不同模块或组件之间建立协同工作,但这些模块或组件的接口并不完全兼容。
- 当需要在遗留代码与新代码之间实现互操作性,同时保持对原有代码的封装。
适配器模式在现代软件设计中的地位与价值
适配器模式在现代软件设计中具有重要地位,它有助于解决不同组件或模块之间接口不兼容的问题。通过使用适配器模式,我们可以更容易地将已有的功能和接口应用于新的场景,实现对现有代码的复用。此外,适配器模式还有助于实现系统的解耦,提高了代码的灵活性和可维护性。在实际项目开发中,熟练掌握并应用适配器模式,能够帮助我们更高效地完成系统集成与模块协同工作。
适配器模式基本概念
适配器模式的定义与核心思想
适配器模式(Adapter Pattern)是一种结构型设计模式,它的核心思想是将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类能够一起工作。适配器模式通常通过引入一个中间适配器类来实现,该类实现目标接口并包装需要适配的类,使得客户端代码可以通过目标接口与适配类交互,而无需关心适配类与被适配类之间的实际实现细节。
类适配器与对象适配器的比较
- 类适配器:类适配器使用多重继承(或实现)的方式,让适配器类既继承(或实现)目标接口,又继承被适配类。类适配器可以通过覆盖被适配类的方法实现特定的功能,但它的局限性在于无法适配被适配类的子类。
- 对象适配器:对象适配器使用对象组合的方式,让适配器类实现目标接口,并在适配器类中包含一个被适配类的对象。对象适配器可以通过调用被适配类的对象实现特定的功能,同时可以适配被适配类及其子类。对象适配器在很多编程语言中被广泛使用,因为它更加灵活且适用范围更广。
设计原则与适配器模式的关系
适配器模式与以下设计原则密切相关:
- 里氏替换原则:适配器模式通过引入适配器类,使得客户端可以使用目标接口替换被适配类,满足里氏替换原则。
- 接口隔离原则:适配器模式使客户端仅依赖于目标接口,而无需关心被适配类的实现细节,实现了接口隔离原则。
- 依赖倒置原则:适配器模式通过使用目标接口与被适配类进行解耦,使得客户端依赖抽象接口而非具体实现,符合依赖倒置原则。
- 单一职责原则:适配器类专注于处理接口转换的工作,满足单一职责原则。
类适配器实现
类适配器模式的UML图
类适配器模式的UML图包含以下几个主要角色:
- Target(目标接口):定义客户端期望的接口,以满足客户端的需求。
- Adaptee(被适配类):需要适配的类,它的接口与目标接口不兼容。
- Adapter(适配器类):实现目标接口并继承被适配类,负责将目标接口的调用转换为被适配类的调用。
类适配器模式的实现步骤
- 定义目标接口(Target):根据客户端的需求定义目标接口。
- 实现被适配类(Adaptee):实现具体功能的被适配类。
- 实现适配器类(Adapter):创建适配器类,使其既实现目标接口,又继承被适配类。在适配器类中,覆盖目标接口的方法,并在这些方法中调用被适配类的方法以实现功能。
类适配器模式的示例代码与解析
假设我们有一个MediaPlayer
目标接口和一个VLCPlayer
被适配类,现在我们需要实现一个适配器类使得客户端可以通过MediaPlayer
接口使用VLCPlayer
的功能。
// MediaPlayer.h
class MediaPlayer {
public:virtual void play(const std::string& audioType, const std::string& fileName) = 0;
};// VLCPlayer.h
class VLCPlayer {
public:void playVLC(const std::string& fileName) {std::cout << "Playing VLC file: " << fileName << std::endl;}
};// MediaPlayerAdapter.h
#include "MediaPlayer.h"
#include "VLCPlayer.h"class MediaPlayerAdapter : public MediaPlayer, public VLCPlayer {
public:void play(const std::string& audioType, const std::string& fileName) override {if (audioType == "vlc") {playVLC(fileName);}}
};// Client.cpp
#include "MediaPlayer.h"
#include "MediaPlayerAdapter.h"int main() {MediaPlayer* mediaPlayer = new MediaPlayerAdapter();mediaPlayer->play("vlc", "example.vlc");delete mediaPlayer;return 0;
}
在这个示例中,MediaPlayerAdapter
继承了MediaPlayer
目标接口和VLCPlayer
被适配类。在play
方法中,MediaPlayerAdapter
调用了VLCPlayer
的playVLC
方法,使得客户端可以通过MediaPlayer
接口使用VLCPlayer
的功能。
适配器模式的应用场景
适配器模式主要用于解决接口不兼容的问题,通过引入一个适配器类,使得原本无法直接协同工作的类可以一起工作。以下是适配器模式的一些典型应用场景:
软件库与组件之间的兼容性
在软件开发过程中,我们经常会使用第三方库或者组件来完成特定的功能。然而,有时候这些库或组件提供的接口与我们的系统中已有的接口不兼容。为了实现这些库或组件的无缝集成,可以使用适配器模式将第三方库或组件的接口适配到我们系统中的接口。
基于不同硬件平台的统一接口设计
在某些应用场景下,软件系统需要在不同的硬件平台上运行。然而,不同硬件平台可能提供了不同的接口和调用方式。为了使得软件系统能够在不同的硬件平台上正常运行,可以通过适配器模式为每个硬件平台提供一个统一的接口。这样,软件系统只需要面向统一的接口进行开发,而不需要关注具体硬件平台的差异。
异构系统之间的通信与协同
在分布式系统或微服务架构中,各个子系统可能使用了不同的技术栈,导致它们之间的接口无法直接通信。为了解决这个问题,可以使用适配器模式为每个子系统提供一个适配器,将各个子系统的接口转换为统一的接口。这样,子系统之间就可以通过这个统一接口进行通信与协同,降低了系统的耦合度。
总之,在需要解决接口不兼容问题的场景中,适配器模式可以提供一种简洁、高效的解决方案,帮助开发者实现不同系统、组件或硬件之间的无缝集成。
适配器模式的优缺点
适配器模式的优势:
- 增加了类的透明性和复用性:适配器模式将具有特定功能的实现类与抽象接口解耦,使得实现类可以独立地被重用,同时使得客户端可以透明地使用这些实现类,提高了代码的复用性和可维护性。
- 降低系统的耦合度:通过引入适配器类,将不兼容的接口转换为兼容的接口,使得原本无法协同工作的类可以一起工作,降低了系统各部分之间的耦合度。
- 提高灵活性:适配器模式使得系统在不修改现有代码的情况下,可以支持新的接口或适应新的场景。这使得系统具有更好的灵活性和扩展性。
适配器模式的局限性与不适用场景:
- 过多地使用适配器模式可能导致系统变得复杂:虽然适配器模式可以解决接口不兼容问题,但是如果大量地使用适配器模式,会使系统中存在许多适配器类,从而导致系统的结构变得复杂,难以维护。
- 不适用于抽象层次差异较大的场景:适配器模式主要适用于解决接口不兼容问题。当需要适配的类之间的抽象层次差异较大时,使用适配器模式可能会导致适配器类过于复杂,无法满足适配的需求。
- 不适用于需要频繁修改适配对象的场景:适配器模式通常适用于稳定的适配场景,即需要适配的对象不会频繁发生变化。如果需要适配的对象经常发生变化,频繁修改适配器类可能会导致代码维护困难。
综上,适配器模式在解决接口不兼容问题方面具有显著优势,但也有一定的局限性。在实际应用中,应根据具体场景判断是否使用适配器模式。
适配器模式在实际项目中的应用
适配器模式在解决接口不兼容问题方面具有优势,以下是一些适配器模式在实际项目中的应用示例:
开发跨平台的图形用户界面库:
在开发跨平台的图形用户界面库时,每个操作系统平台可能提供不同的底层API和绘图函数。为了实现在不同平台上提供统一的图形用户界面API,可以使用适配器模式为每个操作系统实现一个适配器类,将底层API和绘图函数适配为统一的接口。这样,上层应用程序可以基于这个统一接口进行开发,而不需要关注底层API的差异。
搭建不同数据库系统间的数据迁移工具:
在实际项目中,可能需要将数据从一个数据库系统迁移到另一个数据库系统。然而,不同的数据库系统可能使用不同的数据结构和查询语言。为了实现数据迁移工具的通用性,可以使用适配器模式为每个数据库系统实现一个适配器类,将各个数据库系统的操作适配为统一的接口。这样,数据迁移工具可以基于这个统一接口进行开发,从而支持多种数据库系统间的数据迁移。
开发统一的硬件驱动接口与设备访问层:
在实际项目中,可能需要在不同的硬件平台上运行。然而,不同硬件平台可能提供了不同的接口和调用方式。为了使软件系统能够在不同的硬件平台上正常运行,可以通过适配器模式为每个硬件平台提供一个统一的硬件驱动接口。这样,软件系统只需要面向统一的硬件驱动接口进行开发,而不需要关注具体硬件平台的差异。这种模式还可应用于嵌入式系统和物联网设备等领域,实现不同设备之间的无缝集成和协同工作。
适配器模式与其他设计模式的关联
适配器模式在实际项目中的应用广泛,可以有效地解决接口不兼容问题,简化系统设计和开发,提高软件系统的灵活性和可维护性。
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口。适配器模式允许原本不兼容的类能够相互合作。
适配器模式与装饰器模式的比较:
装饰器模式(Decorator Pattern)也是一种结构型设计模式,用于在不修改原有类结构的情况下,动态地为对象添加新的功能。装饰器模式通过创建一个包装类,该类持有原始类的一个实例,并提供与原始类相同的接口。
适配器模式和装饰器模式的区别在于它们的目的和实现方式:
- 目的:适配器模式主要用于解决不兼容的接口问题,使得原本不兼容的类能够一起工作;装饰器模式主要用于在不修改原始类的基础上,为对象添加新功能。
- 实现方式:适配器模式通常会提供一个新的接口,以适应客户端的需求;装饰器模式会遵循原始类的接口,并在内部组合一个原始类的实例,以实现新功能的添加。
适配器模式与桥接模式的比较:
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象与实现解耦,使得它们可以独立地进行变化。桥接模式通过在抽象类和实现类之间引入一个抽象接口,实现抽象与具体实现的解耦。
适配器模式和桥接模式的主要区别在于它们解决的问题和目的:
- 问题:适配器模式解决的是已有的两个不兼容接口之间的协作问题;桥接模式解决的是在抽象与具体实现之间保持解耦的问题,以便它们可以独立变化。
- 目的:适配器模式主要用于让不兼容的接口协同工作;桥接模式主要用于保持抽象与实现之间的解耦,以便在不影响彼此的情况下进行修改和扩展。
适配器模式与外观模式的比较:
外观模式(Facade Pattern)是一种结构型设计模式,用于为一个复杂的子系统提供一个简化的接口。外观模式通过创建一个外观类,该类封装了子系统的复杂性,为客户端提供简单易用的接口。
适配器模式和外观模式的主要区别在于它们的目的和使用场景:
- 目的:适配器模式的目的是将一个类的接口转换为客户端期望的另一个接口,使得原本接口不兼容的类能够一起工作;而外观模式的目的是为一个复杂的子系统提供一个简化的接口,以降低客户端与子系统之间的交互复杂性。
- 使用场景:适配器模式主要用于解决已有类或组件之间接口不兼容的问题,它通常在已有系统中使用,以适应新的需求;而外观模式通常用于封装复杂子系统,让客户端可以通过一个简化的接口与子系统交互,降低系统的复杂度。
总结一下,适配器模式、装饰器模式、桥接模式和外观模式都是结构型设计模式,但它们解决的问题和目的有所不同。适配器模式用于解决接口不兼容的问题;装饰器模式用于动态地为对象添加新功能;桥接模式用于保持抽象与实现之间的解耦;而外观模式用于简化复杂子系统的接口。根据实际项目需求和场景,可以灵活选用合适的设计模式。
适配器模式在C++中的应用领域
- 图形用户界面适配器:用于将不同操作系统或图形用户界面库的API封装成统一的接口,以便开发者可以在不同平台上创建一致的图形用户界面。
- 数据库适配器:为不同的数据库系统(如MySQL、PostgreSQL、SQLite等)提供统一的访问接口,简化应用程序与数据库之间的交互。
- 网络通信适配器:用于适配不同网络通信协议(如TCP、UDP、HTTP等)的接口,使得应用程序可以轻松地在不同的通信协议之间切换。
- 图像处理适配器:为不同的图像处理库(如OpenCV、ImageMagick等)提供统一的接口,使得开发者可以在不修改代码的情况下切换图像处理库。
- 音视频处理适配器:用于适配不同音视频处理库(如FFmpeg、GStreamer等)的接口,简化音视频处理的开发流程。
- 算法适配器:为不同的算法库(如STL、Boost、Eigen等)提供统一的接口,方便开发者在不同的算法库之间切换。
- 机器学习适配器:用于适配不同的机器学习库(如TensorFlow、PyTorch等)的接口,使得开发者可以在不修改代码的情况下切换机器学习框架。
- 游戏引擎适配器:为不同的游戏引擎(如Unity、Unreal Engine等)提供统一的接口,使得游戏开发者可以在不同的游戏引擎之间切换。
- 操作系统适配器:用于适配不同操作系统(如Windows、Linux、macOS等)的API,使得开发者可以在不同平台上创建跨平台应用。
- 物联网设备适配器:用于适配不同物联网设备(如智能家居设备、工业设备等)的接口,简化物联网设备间的通信与互操作。
适配器模式在这些领域的应用可以使开发者专注于业务逻辑,而不必担心不同组件、库或平台之间的接口不兼容问题。通过适配器模式,开发者可以更轻松地将各种技术集成到自己的项目中,实现灵活的组合和扩展。
为什么要用适配器模式?
适配器模式、方法重载、类模板和模板方法模式虽然都可以用于适配不同的对象或情况,但它们的概念、目的和实现方式有很大区别:
- 适配器模式:适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口。适配器模式的主要目的是让原本接口不兼容的类能够一起工作。适配器模式通常用于已有系统中,以适应新的需求或者让不同的组件、库或平台之间的接口协同工作。
- 方法重载:方法重载是一种多态性的表现,允许一个类中存在多个同名方法,但它们的参数列表(参数类型、个数或顺序)不同。方法重载的目的是让一个方法根据不同的参数类型或个数执行不同的功能。方法重载在编译时就确定了调用哪个方法,因此也被称为静态多态或编译时多态。
- 类模板:类模板是C++中泛型编程的一种方式,允许开发者创建具有通用类型的类。类模板的主要目的是提高代码的复用性,减少重复代码,使得开发者可以针对不同的数据类型使用相同的类结构和逻辑。类模板在编译时进行类型替换,生成特定类型的类实例。
- 模板方法模式:模板方法模式是一种行为型设计模式,它在一个抽象类中定义了一个算法的骨架(步骤顺序),并将一些具体步骤的实现延迟到子类中。模板方法模式的目的是实现算法的固定部分,并封装可变部分,使得子类可以在不改变算法结构的情况下重定义算法的某些特定步骤。
总之,适配器模式、方法重载、类模板和模板方法模式在概念、目的和实现方式上都有很大区别。适配器模式关注于解决接口不兼容问题;方法重载关注于根据不同参数实现多态性;类模板关注于提高代码复用性,支持泛型编程;模板方法模式关注于封装算法的骨架,并允许子类自定义某些步骤。在实际开发中,根据实际需求和场景选择合适的方法来适应不同的情况。
未来展望
适配器模式在软件设计中的优势
适配器模式在软件设计中具有以下优势:
- 提高了系统的复用性:适配器模式使原本接口不兼容的类能够一起工作,从而减少了重复代码和开发成本。
- 增加了系统的扩展性:通过适配器模式,可以轻松地将新的组件、库或平台整合到现有系统中,实现灵活的组合和扩展。
- 解耦合:适配器模式可以将不同组件之间的依赖关系降至最低,使得系统更容易维护和升级。
- 提高代码的可读性和可维护性:适配器模式将接口适配的逻辑封装在适配器类中,使得开发者更容易理解和维护系统。
设计模式的发展趋势与前景
设计模式作为一种经过验证的最佳实践,已经在软件工程中得到了广泛应用。随着软件行业的发展和技术的创新,设计模式的发展趋势和前景可以概括如下:
- 面向服务和微服务架构的设计模式:随着服务化和微服务架构的普及,需要更多的针对这类架构的设计模式来支持快速、稳定和可扩展的系统构建。
- 分布式和云计算的设计模式:随着分布式系统和云计算技术的发展,需要新的设计模式来应对分布式和云环境中的特殊问题和挑战。
- 数据驱动和人工智能的设计模式:随着大数据和人工智能技术的蓬勃发展,需要针对数据处理和机器学习等领域的设计模式来提高算法的效率和可靠性。
- 安全性和隐私保护的设计模式:随着网络安全和隐私保护日益受到重视,需要新的设计模式来应对安全和隐私保护方面的挑战。
结语
在本篇博客的结尾,我们从心理学的角度来探讨了适配器模式的优势。适配器模式不仅在软件设计中具有很高的价值,而且与人类心理特点和认知过程紧密相连。以下是我们从心理学角度对适配器模式进行的总结:
- 降低认知负荷:适配器模式将不同组件之间的适配过程封装在适配器类中,使开发者无需关注细节。这样可以降低开发者的认知负荷,让他们能更专注于业务逻辑和功能实现。
- 提高问题解决能力:根据心理学研究,人们在解决问题时倾向于寻找已知的、经过验证的解决方案。适配器模式作为一种经典的设计模式,为开发者提供了一种在面对接口不兼容问题时的通用解决方案,从而提高了问题解决能力。
- 满足心理安全需求:人们在面对陌生环境和挑战时,往往会感到不安和担忧。适配器模式提供了一种可预测、可控的方式来适应不同组件、库或平台,从而降低了不确定性,满足了人们的心理安全需求。
- 强化自我效能感:心理学家阿尔伯特·班杜拉提出了自我效能感的概念,指的是个体对自己完成任务和实现目标的信心和能力。使用适配器模式,开发者能够更容易地将各种技术集成到自己的项目中,实现灵活的组合和扩展,从而增强了自我效能感。
- 促进心流体验:心流是指个体在全神贯注地进行某项活动时所产生的愉悦心境。当开发者在使用适配器模式进行软件设计时,可以更专注于创新和解决问题,从而更容易进入心流状态,提高工作效率和满意度。
综上所述,适配器模式不仅在软件设计领域具有广泛的应用前景,而且与人类心理特点和认知过程紧密相连。这使得适配器模式成为一种具有极高价值的设计模式,值得开发者在实际工作中广泛应用和推广。在今后的软件开发实践中,适配器模式势必将发挥更大的作用
相关文章:

适配器模式:C++设计模式中的瑞士军刀
适配器模式揭秘:C设计模式中的瑞士军刀引言设计模式的重要性适配器模式简介与应用场景适配器模式在现代软件设计中的地位与价值适配器模式基本概念适配器模式的定义与核心思想类适配器与对象适配器的比较设计原则与适配器模式的关系类适配器实现类适配器模式的UML图…...

【三十天精通Vue 3】 第三天 Vue 3的组件详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 组件的概述1. Vue 3 的组件系统2. Vue 3 组件的特点…...

SqlServer实用系统视图,你了解多少?
SqlServer实用系统视图,你了解多少?前言master..spt_valuessysdatabasessysprocesses一套组合拳sysobjectssys.all_objectssyscolumnssystypessyscommentssysindexes结束语前言 在使用任何数据库软件的时候,该软件都会提供一些可能不是那么公…...

NodeJS Cluster模块基础教程
Cluster简介 默认情况下,Node.js不会利用所有的CPU,即使机器有多个CPU。一旦这个进程崩掉,那么整个 web 服务就崩掉了。 应用部署到多核服务器时,为了充分利用多核 CPU 资源一般启动多个 NodeJS 进程提供服务,这时就…...

[C++笔记]vector
vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样,vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问,和数组一样高效。与数组不同的是,它的大小可以动态改变——…...

Python 迁移学习实用指南:1~5
原文:Hands-On Transfer Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…...

【CSS重点知识】属性计算的过程
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 标题什么是计算机属性确定声明值层叠冲突继承使用默认值总结什么是计算机属性 CSS属性值的计算…...

Java避免死锁的几个常见方法(有测试代码和分析过程)
目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 :jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源,尽量保证每个锁…...

go binary包
binary包使用与详解 最近在看一个第三方包的库源码,bigcache,发现其中用到了binary 里面的函数,所以准备研究一下。 可以看到binary 包位于encoding/binary,也就是表示这个包的作用是编辑码作用的,看到文档给出的解释…...

CompletableFuture使用详解(IT枫斗者)
CompletableFuture使用详解 简介 概述 CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,完美弥补了Future的局限性,同时CompletableFuture实现了对任务编排的能力。借助这项能力…...

4.15--设计模式之创建型之责任链模式(总复习版本)---脚踏实地,一步一个脚印
一、什么是责任链模式: 责任链模式属于行为型模式,是为请求创建了一个接收者对象的链,将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首端发出时&a…...

STM32+W5500实现以太网通信
STM32系列32位微控制器基于Arm Cortex-M处理器,旨在为MCU用户提供新的开发自由度。它包括一系列产品,集高性能、实时功能、数字信号处理、低功耗/低电压操作、连接性等特性于一身,同时还保持了集成度高和易于开发的特点。本例采用STM32作为MC…...

全网最详细,Jmeter性能测试-性能基础详解,终成测试卷王(一)
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 发起请求 发起HTTP…...

人工智能概述
一、人工智能发展必备三要素 算法 数据 算力 CPU、GPU、TPU 计算力之CPU、GPU对比: CPU主要适合I\O密集型任务GPU主要适合计算密集型任务 什么样的程序适合在GPU上运行? 计算密集型的程序 所谓计算密集型(Compute-intensive)的程序,就是…...

API接口安全—webservice、Swagger、WEBpack
API接口安全—webservice、Swagger、WEBpack1. API接口介绍1.1. 常用的API接口类1.1.1. API接口分类1.1.1.1. 类库型API1.1.1.2. 操作系统型API1.1.1.3. 远程应用型API1.1.1.4. WEB应用型API1.1.1.5. 总结1.1.2. API接口类型1.1.2.1. HTTP类接口1.1.2.2. RPC类接口1.1.2.3. web…...

从前M个字母中取N个的无重复排列 [2*+]
目录 从前M个字母中取N个的无重复排列 [2*+] 程序设计 程序分析 从前M个字母中取N个的无重复排列 [2*+] 输出从前M个字母中取N个的无重复字母排列 Input 输入M N 1<=M=10, N<=M Output 按字典序输出排列 Sample Input 4 2 Sample Output A B A C A D B A B C B …...

ES forceMerge 强制段合并为什么会提升检索性能?
根据以前的测试,forceMerge段合并,将段的个数合并成一个。带来了将近一倍的性能提升,测试过程文档(请参考我的另外一篇文章):ES优化实战- forceMerge搜索提升测试报告_es forcemerge_水的精神的博客-CSDN博…...

macOS Ventura 13.3.1 (22E261) Boot ISO 原版可引导镜像
本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 macOS Ventura 13.3.1 为 Mac 提供下…...

html+css+JavaScript+json+servlet的社区系统(手把手教学)
目录 课前导读: 一、系统前期准备 二、前端代码的编写 三、登陆页面简介 四、注册页面 五、社区列表页 六、社区详情页 七、社区发帖页 八、注销 九、访问链接 登陆页面http://175.178.20.77:8080/java106_blog_system/login.html 总结: 课前…...

UI Toolkit(1)
UI ToolkitUI Toolkit界面画布设置背景制作UI布局UI Toolkit界面 在Unity 2021LTS版本之后UI Toolkit也被内置在Unity中,Unity有意的想让UI Toolkit 成为UI的主要搭建方式,当然与UGUI相比还是有一定的差别。他们各有有点,这次我们就开始介绍…...

vLive带你走进虚拟直播世界
虚拟直播是什么? 虚拟直播是基于5G实时渲染技术,在绿幕环境下拍摄画面,通过实时抠像、渲染与合成,再推流到直播平台的一种直播技术。尽管这种技术早已被影视工业所采用,但在全民化进程中却是困难重重,面临…...

初谈 ChatGPT
引子 最近,小编发现互联网中的大 V 突然都在用 ChatGPT 做宣传:“ChatGPT不会淘汰你,能驾驭ChatGPT的人会淘汰你”、“带领一小部分人先驾驭ChatGPT”。 确实,ChatGPT这个新生事物,如今被视为蒸汽机、电脑、iPhone 般的…...

JAVA练习103-螺旋矩阵
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 4月9日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-螺…...

RecvByteBufAllocator内存分配计算
虽然了解了整个内存池管理的细节,包括它的内存分配的具体逻辑,但是每次从NioSocketChannel中读取数据时,应该分配多少内存去读呢? 例如,客户端发送的数据为1KB , 应该分配多少内存去读呢? 例如:…...

图数据结构与算法
什么是图数据的结构 图是由顶点和边组成的非线性数据结构。顶点有时也称为节点,边是连接图中任意两个节点的线或弧。更正式地说,图由一组顶点 ( V ) 和一组边 ( E ) 组成。该图由 G(E, V) 表示。 图的组成部分 顶点:顶点是图的基本单位。有时,顶点也称为顶点或节点。每个节…...

科普:c语言与C++的区别
C语言和C语言是两种广泛使用的编程语言,尽管它们非常相似,但它们在某些方面也存在不同之处。本文将详细介绍C语言和C语言的区别。 1. 编程范式 C语言是一种过程式编程语言,它的设计目标是为了编写操作系统和其他系统级编程。C语言是一种面向…...

流量整形(GTS和LR)
Generic Traffic Shaping通用流量整形 通用流量整形(简称GTS)可以对不规则或不符合预定流量特性的流量进行整形,以保证网络上下游之间的带宽匹配,避免拥塞发生。 GTS与CAR一样,都采用了令牌桶技术来控制流量。GTS与CAR的主要区别在于:利用CAR进行报文流量控制时,…...

Java接口详细讲解
目录 Java接口概念 Java接口主要有以下特点 Java接口的具体作用 定义接口 实现接口 接口继承 默认方法 静态方法 Java接口概念 Java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 …...

元宇宙地产暴跌,林俊杰亏麻了
文/章鱼哥出品/陀螺财经随着元宇宙的兴起,元宇宙地产曾一度被寄予厚望,成为各大投资者追捧的对象。然而,最近的一次元宇宙地产价值暴跌再次提醒我们,高收益背后可能伴随着高风险。根据元宇宙分析平台WeMeta的数据显示,…...

什么是瀑布流布局?瀑布流式布局的优缺点
瀑布流又称瀑布流式布局,是一种多列等宽不等高的一种页面布局方式。 视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局会不断加载数据并附加至当前的尾部。 是一种多列等宽不等高的一种页面布局方式,用于图片比较复杂&#…...