设计模式8-桥模式

news2025/2/25 16:27:11

设计模式8-Bridge 桥模式

  • 由来与目的
  • 模式定义
  • 结构
  • 代码推导
      • 1. 类和接口的定义
      • 2. 平台实现
      • 3. 业务抽象
      • 4. 使用示例
      • 总结
      • 1. 类数量过多,复杂度高
      • 2. 代码重复
      • 3. 不符合单一职责原则
      • 4. 缺乏扩展性
      • 改进后的设计
        • 1. 抽象和实现分离(桥接模式)
        • 2. 抽象类
        • 3. 使用装饰者模式添加功能
        • 4. 使用示例
      • 改进后的优点
    • 疑问
      • 1. `protected` 访问级别的意义
      • 2. `protected` 的使用场景
      • 具体分析代码中的选择
        • 1. `protected` 访问级别的好处
        • 2. 如果使用`private`
        • 3. 如果使用`public`
      • 总结
  • 要点总结

桥模式也属于单一职责模式中的一种。

由来与目的

桥模式的由来以及目的:由于某些类型的固有的实现逻辑使他们具有两个变化的维度乃至多个维度的变化。那么此时如何应对这种多维度的变化,如何利用面向对象技术?来使得类型可以轻松地沿着两个乃至多个方向进行变化,而不引入额外的复杂度呢?那么乔模式就应运而生,他的存在就是为了解决此类问题。

模式定义

将抽象部分也就是业务功能,与实现部分分离,使他们都可以独立的变化。

结构

在这里插入图片描述

代码推导

class Messager{
public:
    virtual void Login(string username, string password)=0;
    virtual void SendMessage(string message)=0;
    virtual void SendPicture(Image image)=0;

    virtual void PlaySound()=0;
    virtual void DrawShape()=0;
    virtual void WriteText()=0;
    virtual void Connect()=0;
    
    virtual ~Messager(){}
};


//平台实现

class PCMessagerBase : public Messager{
public:
    
    virtual void PlaySound(){
        //**********
    }
    virtual void DrawShape(){
        //**********
    }
    virtual void WriteText(){
        //**********
    }
    virtual void Connect(){
        //**********
    }
};

class MobileMessagerBase : public Messager{
public:
    
    virtual void PlaySound(){
        //==========
    }
    virtual void DrawShape(){
        //==========
    }
    virtual void WriteText(){
        //==========
    }
    virtual void Connect(){
        //==========
    }
};



//业务抽象

class PCMessagerLite : public PCMessagerBase {
public:
    
    virtual void Login(string username, string password){
        
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message){
        
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        
        PCMessagerBase::DrawShape();
        //........
    }
};



class PCMessagerPerfect : public PCMessagerBase {
public:
    
    virtual void Login(string username, string password){
        
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message){
        
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::DrawShape();
        //........
    }
};


class MobileMessagerLite : public MobileMessagerBase {
public:
    
    virtual void Login(string username, string password){
        
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message){
        
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        
        MobileMessagerBase::DrawShape();
        //........
    }
};


class MobileMessagerPerfect : public MobileMessagerBase {
public:
    
    virtual void Login(string username, string password){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::DrawShape();
        //........
    }
};


void Process(){
        //编译时装配
        Messager *m =
            new MobileMessagerPerfect();
}




这段代码实现了一个跨平台的消息传递系统,其中包含了多个层次的抽象和具体实现。它通过将平台相关的功能和业务逻辑分离来实现不同的消息传递方式。

1. 类和接口的定义

class Messager {
public:
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;

    virtual void PlaySound() = 0;
    virtual void DrawShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;
    
    virtual ~Messager() {}
};

Messager 是一个抽象基类,定义了登录、发送消息、发送图片以及平台相关的功能(播放声音、绘制图形、写文本、连接)。

2. 平台实现

class PCMessagerBase : public Messager {
public:
    virtual void PlaySound() {
        //**********
    }
    virtual void DrawShape() {
        //**********
    }
    virtual void WriteText() {
        //**********
    }
    virtual void Connect() {
        //**********
    }
};

class MobileMessagerBase : public Messager {
public:
    virtual void PlaySound() {
        //==========
    }
    virtual void DrawShape() {
        //==========
    }
    virtual void WriteText() {
        //==========
    }
    virtual void Connect() {
        //==========
    }
};

PCMessagerBaseMobileMessagerBase 是平台相关的具体实现类,分别实现了 PC 和移动平台上的功能。这两个类分别实现了播放声音、绘制图形、写文本和连接的方法。

3. 业务抽象

class PCMessagerLite : public PCMessagerBase {
public:
    virtual void Login(string username, string password) {
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message) {
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image) {
        PCMessagerBase::DrawShape();
        //........
    }
};

class PCMessagerPerfect : public PCMessagerBase {
public:
    virtual void Login(string username, string password) {
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message) {
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image) {
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::DrawShape();
        //........
    }
};

class MobileMessagerLite : public MobileMessagerBase {
public:
    virtual void Login(string username, string password) {
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message) {
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image) {
        MobileMessagerBase::DrawShape();
        //........
    }
};

class MobileMessagerPerfect : public MobileMessagerBase {
public:
    virtual void Login(string username, string password) {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message) {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image) {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::DrawShape();
        //........
    }
};

这些类继承自平台实现类,并且在每个方法中调用了相应的基类方法,添加了业务逻辑。具体而言,PCMessagerLiteMobileMessagerLite 是简化版的实现,而 PCMessagerPerfectMobileMessagerPerfect 则是带有更多功能(如播放声音)的完整实现。

4. 使用示例

void Process() {
    //编译时装配
    Messager *m = new MobileMessagerPerfect();
}

Process 函数展示了如何创建一个 MobileMessagerPerfect 实例并赋值给 Messager 指针。

总结

这段代码通过将不同平台的实现和业务逻辑分开,展示了如何使用继承和多态来实现跨平台的消息传递系统。它遵循了开闭原则(对扩展开放,对修改关闭),使得添加新的平台或功能变得更容易。具体地,Messager 定义了接口,PCMessagerBaseMobileMessagerBase 实现了平台相关的功能,而 PCMessagerLitePCMessagerPerfectMobileMessagerLiteMobileMessagerPerfect 实现了具体的业务逻辑。

这段代码虽然展示了一个灵活的跨平台消息传递系统的设计,但仍然存在一些缺陷和改进空间。以下是一些主要的缺陷及其解决方案:

1. 类数量过多,复杂度高

缺陷:每添加一个新功能或新平台,都需要创建大量新的类,导致类数量爆炸,假设此时平台类数量为n ,平台实现功能类数量为m ,那么此时类的数量为1+n+m*n,增加了代码的复杂性和维护成本。
解决方案:可以使用桥接模式(Bridge Pattern),将抽象和实现分离,从而减少类的数量和复杂度。

2. 代码重复

缺陷:许多方法在不同类中有重复的实现,如 PlaySound()DrawShape()WriteText()Connect() 方法在不同类中基本相同。
解决方案:将这些方法提取到一个单独的类中,或者使用组合而不是继承来减少代码重复。

3. 不符合单一职责原则

缺陷Messager 类同时处理平台相关的实现和业务逻辑,违背了单一职责原则,使得类的职责不清晰。
解决方案:将平台相关的实现和业务逻辑分离,使用桥接模式或策略模式将这些职责分开。

4. 缺乏扩展性

缺陷:添加新功能(如加密、压缩等)需要创建大量新的类,缺乏灵活性。
解决方案:可以使用装饰者模式(Decorator Pattern)来动态地为对象添加职责,而不需要创建大量的子类。

改进后的设计

使用桥接模式和装饰者模式重新设计:

1. 抽象和实现分离(桥接模式)
class MessagerImp {
public:
    virtual void PlaySound() = 0;
    virtual void DrawShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;
    virtual ~MessagerImp() {}
};

class PCMessagerImp : public MessagerImp {
public:
    void PlaySound() override {
        // PC平台实现
    }
    void DrawShape() override {
        // PC平台实现
    }
    void WriteText() override {
        // PC平台实现
    }
    void Connect() override {
        // PC平台实现
    }
};

class MobileMessagerImp : public MessagerImp {
public:
    void PlaySound() override {
        // 移动平台实现
    }
    void DrawShape() override {
        // 移动平台实现
    }
    void WriteText() override {
        // 移动平台实现
    }
    void Connect() override {
        // 移动平台实现
    }
};
2. 抽象类
class Messager {
protected:
    MessagerImp* imp;
public:
    Messager(MessagerImp* imp) : imp(imp) {}
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;
    virtual ~Messager() {}
};

class MessagerLite : public Messager {
public:
    MessagerLite(MessagerImp* imp) : Messager(imp) {}
    void Login(string username, string password) override {
        imp->Connect();
        // Lite版特有的登录逻辑
    }
    void SendMessage(string message) override {
        imp->WriteText();
        // Lite版特有的发送消息逻辑
    }
    void SendPicture(Image image) override {
        imp->DrawShape();
        // Lite版特有的发送图片逻辑
    }
};

class MessagerPerfect : public Messager {
public:
    MessagerPerfect(MessagerImp* imp) : Messager(imp) {}
    void Login(string username, string password) override {
        imp->PlaySound();
        imp->Connect();
        // Perfect版特有的登录逻辑
    }
    void SendMessage(string message) override {
        imp->PlaySound();
        imp->WriteText();
        // Perfect版特有的发送消息逻辑
    }
    void SendPicture(Image image) override {
        imp->PlaySound();
        imp->DrawShape();
        // Perfect版特有的发送图片逻辑
    }
};
3. 使用装饰者模式添加功能
class MessagerDecorator : public Messager {
protected:
    Messager* messager;
public:
    MessagerDecorator(Messager* messager) : Messager(messager->imp), messager(messager) {}
    void Login(string username, string password) override {
        messager->Login(username, password);
    }
    void SendMessage(string message) override {
        messager->SendMessage(message);
    }
    void SendPicture(Image image) override {
        messager->SendPicture(image);
    }
};

class EncryptedMessager : public MessagerDecorator {
public:
    EncryptedMessager(Messager* messager) : MessagerDecorator(messager) {}
    void Login(string username, string password) override {
        // 加密登录
        MessagerDecorator::Login(username, password);
    }
    void SendMessage(string message) override {
        // 加密消息
        MessagerDecorator::SendMessage(message);
    }
    void SendPicture(Image image) override {
        // 加密图片
        MessagerDecorator::SendPicture(image);
    }
};
4. 使用示例
void Process() {
    MessagerImp* pcImp = new PCMessagerImp();
    Messager* m = new EncryptedMessager(new MessagerPerfect(pcImp));
    m->Login("user", "password");
    m->SendMessage("Hello, World!");
    // Clean up
    delete m;
    delete pcImp;
}

改进后的优点

  1. 减少类数量:通过桥接模式,将平台相关实现和业务逻辑分离,减少了类的数量,此时类的数量为(1+n+m) < (1+n+m*n)。
  2. 减少代码重复:将公共方法提取到实现类中,减少了代码重复。
  3. 职责清晰:将平台相关实现和业务逻辑分离,符合单一职责原则。
  4. 增加扩展性:通过装饰者模式,能够动态地添加新功能,而无需创建大量新的子类。

通过这些改进,可以显著提高代码的可维护性、可扩展性和清晰性。

疑问

在面向对象编程中,选择成员变量的访问级别时,需要考虑类的设计和使用场景。在这段代码中,Messager类的imp成员变量被声明为protected,而不是private或者public,这是有特定原因的。

1. protected 访问级别的意义

protected 访问级别允许子类访问和修改基类中的成员变量,同时对类外部保持不可见。这样可以在保证类的封装性的同时,允许子类进行适当的扩展和修改。

2. protected 的使用场景

在这段代码中,Messager类的设计是为了作为一个基类,它的主要作用是定义接口和提供基础的实现,而具体的实现细节由其子类来完成。因此,将imp成员变量设为protected可以让子类方便地访问和操作这个变量,而无需通过公共接口来访问。

具体分析代码中的选择

1. protected 访问级别的好处
class Messager {
protected:
    MessagerImp* imp;
public:
    Messager(MessagerImp* imp) : imp(imp) {}
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;
    virtual ~Messager() {}
};

class MessagerLite : public Messager {
public:
    MessagerLite(MessagerImp* imp) : Messager(imp) {}
    void Login(string username, string password) override {
        imp->Connect();
        // Lite版特有的登录逻辑
    }
    void SendMessage(string message) override {
        imp->WriteText();
        // Lite版特有的发送消息逻辑
    }
    void SendPicture(Image image) override {
        imp->DrawShape();
        // Lite版特有的发送图片逻辑
    }
};

在这种设计下,MessagerLite和其他子类可以直接访问imp,这使得子类可以轻松地调用平台相关的实现方法,如Connect()WriteText()DrawShape()

2. 如果使用private

如果将imp设为private,子类将无法直接访问imp,需要通过公共的getter和setter方法。这增加了额外的复杂性,而且在某些情况下可能会影响性能和代码的可读性。

class Messager {
private:
    MessagerImp* imp;
public:
    Messager(MessagerImp* imp) : imp(imp) {}
    MessagerImp* getImp() { return imp; }
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;
    virtual ~Messager() {}
};

class MessagerLite : public Messager {
public:
    MessagerLite(MessagerImp* imp) : Messager(imp) {}
    void Login(string username, string password) override {
        getImp()->Connect();
        // Lite版特有的登录逻辑
    }
    void SendMessage(string message) override {
        getImp()->WriteText();
        // Lite版特有的发送消息逻辑
    }
    void SendPicture(Image image) override {
        getImp()->DrawShape();
        // Lite版特有的发送图片逻辑
    }
};
3. 如果使用public

如果将imp设为public,则任何外部代码都可以直接访问和修改imp,这违反了封装原则,容易导致错误和不必要的依赖。

class Messager {
public:
    MessagerImp* imp;
    Messager(MessagerImp* imp) : imp(imp) {}
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;
    virtual ~Messager() {}
};

// 外部代码可以直接访问 imp
Messager* m = new MessagerLite(new PCMessagerImp());
m->imp->Connect(); // 不推荐

总结

MessagerImp* imp设为protected是为了在保持封装性的同时,让子类能够方便地访问和使用该成员变量。这种设计既保证了基类和子类之间的良好协作,又避免了将实现细节暴露给类的外部,提高了代码的可维护性和扩展性。

要点总结

  • 模式使用对象间的组合关系解耦合了。抽象和现实之间固有的绑定关系,使得抽象可实现可以沿着各自的维度来变化所,所谓抽象和实现沿着各自维度的变化,即子类化他们
  • 强模式有时候类似于多继承方案。但是多继承方案往往违背单一职责,原则即一个类只有一个变化的原因,复用性比较差。桥模式是比多继承方案更好的解决方法。
  • 乔模桥模式的应用一般在两个非常强的变化维度,有时一个内页。有。多于两个的变化维度,这时可以使用桥的扩展模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

一款面向程序员群体的AI问答产品火了!主打专业、正确率保障,消灭AI回答不可靠的问题

一直以来&#xff0c;无论是GPT、Claude还有国内的AI对话产品&#xff0c;都一直被诟病“AI回答不可靠”&#xff0c;尤其是在程序员这类对AI回答的可靠性要求极高的场景&#xff08;毕竟AI给代码里埋个bug&#xff0c;背锅的还是程序员&#xff09;。 而且当AI给的代码不可靠…

Androd 12 (MTK)修改屏幕物理分辨率Physical Size

1.需求说明 Android目前显示分辨率为480*800&#xff0c;立项表中像素为720*1280。请修改屏幕分辨率到指定大小。 2.思路分析 如果从手机修改对应的分辨率&#xff0c;必须自上而下的进行修改分为两个层面进行修改。 1.驱动底层 2.软件上层 3.结局方法与相关说明 查看当…

Vue打包文件dist放在SpringBoot项目下运行(正确实现全过程)(下)

在上一篇中&#xff0c;实现了Vue打包文件dist放在SpringBoot项目下运行。 Vue打包文件dist放在SpringBoot项目下运行&#xff08;正确实现全过程&#xff09;&#xff08;上&#xff09; 问题 路由刷新会产生404的问题。 原因 vue开发的应用&#xff0c;采用的是SPA单页…

c语言的简易教法—— 函数递归

文章目录 一、什么是递归&#xff1f;1.1递归的思想1.2递归的限制条件 二、递归案例2.1 案例1&#xff1a;求n的阶层2.1.1分析2.1.2 递归函数&#xff08;Fact&#xff09;的代码实现2.1.3 测试&#xff1a;main函数实现2.1.4 运行结果和画图推演2.1.5 扩展&#xff1a;迭代方法…

纹波电流与ESR:解析电容器重要参数与应用挑战

电解电容纹波电流与ESR&#xff08;Equivalent Series Resistance&#xff09;是电容器的重要参数&#xff0c;用来描述电容器对交流信号的响应能力和能量损耗。电解电容纹波电流是指电容器在工作时承受的交流信号电流&#xff0c;而ESR则是电容器内部等效电阻&#xff0c;影响…

2024年PMP报考需要什么条件?怎么报名?

PMP报名条件要求不高&#xff0c;只要满足下面两个条件&#xff1a; 1、35个PDU &#xff08;需要有 PMI 授权的机构颁发&#xff09; 2、项目经验 学士学位需要 4500 个小时的项目管理经验&#xff0c;3年工作经验&#xff1b; 非学士学位需要 7500 个小时的 项目管理经验&…

机器视觉:(1) 初识Roboflow(使用详解一)获取数据集(最新)

一&#xff1a;访问地址 [1] Roboflow官网&#xff1a;官网地址 [2]YOLOv8 项目地址github源码地址 [3]YOLOv8 官方教程官网教程地址 二&#xff1a;获取数据集步骤 1.访问官网地址&#xff1a;进入首页面&#xff0c;点击登录 2.注册过程省略了&#xff0c;按步骤走就可以…

Qt:18.状态栏(状态栏介绍、代码方式创建状态栏、在状态栏显示临时信息、在状态栏创建控件)

目录 1.状态栏介绍&#xff1a; 2.代码方式创建状态栏&#xff1a; 3. 在状态栏显示临时信息&#xff1a; 4.在状态栏创建控件&#xff1a; 1.状态栏介绍&#xff1a; Qt 状态栏是 QMainWindow 窗口的一部分&#xff0c;通常用于显示临时信息&#xff0c;如应用程序的状态、…

myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目

摘 要 随着计算机的广泛应用&#xff0c;其逐步成为现代化的标志。图书馆的信息量也会越来越大&#xff0c;因此需要对图书信息、借书信息、还书信息等进行管理&#xff0c;及时了解各个环节中信息的变更&#xff0c;要对因此而产生的单据进行及时的处理&#xff0c;为了提高高…

【YashanDB知识库】YashanDB 开机自启

【问题分类】 YashanDB 开机自启 【关键字】 开机自启&#xff0c;依赖包 【问题描述】 数据库所在服务器重启后只拉起monit、yasom、yasom进程&#xff0c;缺少yasdb进程&#xff1a; 【问题原因分析】 数据库安装的时候未启动守护进程 【解决 / 规避方法】 进入数据库之前…

分别通过LS和RML进行模型参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 最小二乘法(LS)参数辨识 4.2 递归最大似然估计(RML)参数辨识 5.完整程序 1.程序功能描述 分别通过LS和RML进行模型参数辨识matlab仿真&#xff0c;仿真输出参数辨识的误差&#xff0c…

【Linux】Linux背景历史

Linux背景历史 Linux背景Linux是什么&#xff1f;计算机的发展unix发展史Linux发展史开源Linux官网以及版本更替Linux企业应用现状 Linux环境的安装 Linux背景 Linux是什么&#xff1f; Linux(Linux Is Not UniX)&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由…

边缘计算网关:一种高效安全的工业物联网解决方案-天拓四方

在工业物联网&#xff08;IIoT&#xff09;领域&#xff0c;数据处理和实时响应的需求日益增长&#xff0c;尤其是在智能制造、远程监控和预测性维护等场景中。边缘计算网关作为一种前端数据处理和决策设备&#xff0c;正逐渐成为满足这些需求的理想解决方案。 在一个大型制造…

前端JS特效第30波:jquery图片列表按顺序分类排列图片组效果

jquery图片列表按顺序分类排列图片组效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &…

智慧景区综合解决方案PPT(53页)

智慧景区综合解决方案摘要 建设背景 智慧景区综合解决方案在文旅融合、政策支撑和行业背景三大背景下提出。文旅融合强调文化和旅游的结合&#xff0c;政策支撑如《“十三五”全国旅游信息化规划》和《江苏省文化和旅游厅2019年工作要点》为智慧旅游提供指导&#xff0c;行业背…

C++相关概念和易错语法(18)(array、模板)

1.array &#xff08;1&#xff09;普通数组的劣势 当我们直接越界修改值时&#xff0c;一般会在编译时就被拦截 但是越界访问&#xff0c;只要访问距离不算特别大&#xff0c;那么也可以越界访问 当我们不直接越界修改或访问&#xff0c;间接去访问和修改能越界非常远 这里的…

AWS认证考试流程:从准备到通过

AWS认证是IT行业中备受推崇的专业资格认证之一&#xff0c;它不仅可以验证您的AWS技能&#xff0c;还能提升您的职业竞争力。本文将为您详细介绍AWS认证考试的完整流程&#xff0c;从初步准备到最终通过认证。 选择适合的认证级别 AWS提供多个级别的认证&#xff0c;包括&…

Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;Java集合框架提供了一组丰富的数据结构&#xff0c;以满足各种应用需求。其中&#xff0c;LinkedList作为一种常用的数据结构&#xff0c;具有独特的优势和广泛的应用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内…

MesooRF:经典蓝牙模块与低功耗蓝牙模块如何区分?

从蓝牙4.0开始&#xff0c;有两种蓝牙芯片模块&#xff1a;经典蓝牙模块(BT)和低能耗(BLE)蓝牙模块。 经典蓝牙是在之前的蓝牙1.0&#xff0c;1.2&#xff0c;EDR 2.0&#xff0c;EDR 2.1&#xff0c;EDR 3.0的基础上发展完善的&#xff0c;而低功耗蓝牙是在Nokia的Wibree标准上…