设计模式深度解析:适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

在这里插入图片描述​🌈 个人主页:danci_
🔥 系列专栏:《设计模式》
💪🏻 制定明确可量化的目标,坚持默默的做事。


适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

探索设计模式的魅力:深入了解适配器模式-优雅地解决接口不匹配问题文章浏览阅读9k次,点赞115次,收藏91次。适配器模式是一种常用的设计模式,它通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容或不匹配而无法协同工作的类能够一起工作。适配器模式主要应用于解决不同组件之间的接口不兼容问题,或者在第三方库与现有系统之间进行集成。通过使用适配器模式,可以提高代码的灵活性和复用性,降低系统间的耦合度。适配器模式有多种实现方式,包括类适配器模式、对象适配器模式和接口适配器模式。在使用适配器模式时,需要注意其优缺点,并根据实际需求选择合适的实现方式。适配器模式可以与其他设计模式结合使用,如与装饰器模…https://blog.csdn.net/danci_/article/details/135891805

探索设计模式的魅力:精准解读桥接模式-用桥接模式构建可扩展的软件系统文章浏览阅读4.8k次,点赞74次,收藏103次。桥接模式是一种设计模式,旨在将抽象和实现部分分离,使它们可以独立地变化。这种模式的目的是提高系统的灵活性和可扩展性。桥接模式的主要思想是将抽象和实现通过一个桥接类连接起来,从而实现它们的解耦。在这种模式中,抽象部分可以根据需要进行扩展,而实现部分可以自由地变化,而不影响彼此。桥接模式在处理多个独立变化的维度、解耦继承关系、处理平台差异和扩展现有系统等方面具有广泛的应用领域。通过使用桥接模式,可以提高系统的可维护性和可扩展性,使系统更加灵活和适应变化。通过桥接模式,将系统中的抽象部分与实现部分解耦,从而…https://blog.csdn.net/danci_/article/details/135949676

引言:
    在本篇文章中,我们将通过生动的说明和直观的比较,带您深入了解适配器模式和桥接模式,助您在软件设计的海洋中乘风破浪。 🚢

文章目录

  • 🎉 <font size=''>探索设计模式的奥秘 🚀</font >
  • Part 1: 适配器模式:让不兼容的接口找到共同语言 💡
    •  定义
    •  作用</code>
  • Part 2: 桥接模式:分离抽象和实现,让它们可以独立变化 🌉
    •  定义
    •  用途
  • Part 3: 大比拼:适配器模式 vs 桥接模式 🤼
    • 结构图 💖
      • 适配器模式(`图1`)
      • 桥接模式(`图2`)
      • 结构上的不同 🛠️
    • 使用场景 🚀
    • 优缺点 🎭
  • <code>Part 4: 易混场景💔<code>
    • 场景:图形渲染系统
    • 使用适配器模式实现:让不兼容的接口找到共同语言 🤔
    • 使用桥接模式:分离抽象和实现,让它们可以独立变化 😉
    • 决择 😅
  • 🔥 结论与行动呼吁 💖

🎉 探索设计模式的奥秘 🚀

  
在这里插入图片描述
  
    设计模式作为软件工程中的黄金准则,引领着开发者高效地解决一般问题,优化代码结构。在这次的探索旅途中,我们深入两个灵活应对变化的英雄——适配器模式和桥接模式。让我们一起解锁它们如何在日益复杂的软件开发世界中,提供优雅的解决方案吧!🎯

    在探索软件工程的广漫领域中,设计模式以其构建高效、可维护代码的能力而矗立不倒。这些模式不仅是编程世界的灵魂,而且是连接理论与实践的桥梁。随着技术的不断进步,设计模式提供了一种以经验为基础的解决方案,使开发者能够避免重新发明轮子。在本章节中,我们将深入探索设计模式的奥秘,揭示它们的本质、如何在各种项目中有效应用它们,以及它们如何帮助我们在日渐复杂的软件开发任务中航行。通过探索经典模式如单例、工厂、策略和观察者模式,我们将展开有关如何通过重用设计模式来优化代码结构、提高代码的复用率以及增强软件的灵活性和可扩展性的讨论。加入我们的旅程,让我们一起探索设计模式的世界,解锁编程的高级技巧,有效应对日益增长的软件复杂性。🌈
 

Part 1: 适配器模式:让不兼容的接口找到共同语言 💡

  
在这里插入图片描述

  

 定义

✨ 适配器模式是一种结构型设计模式,它允许将一个类的接口转换为客户端所期望的另一个接口,从而帮助原本因接口不兼容而无法协同工作的类实现合作。

    适配器模式如同生活中的变压器,其主要作用是将一个类的接口转换成客户期望的另一个接口,使原本因接口不兼容而不能一起工作的那些类可以一起工作。这个部分,我们将通过实际案例,揭示适配器模式的魅力。
  

 作用

    在实际编程中,适配器模式的主要作用是解决接口之间的不兼容性问题。当系统中存在已经实现的类,但其接口与客户端所期望的接口不一致时,通过适配器模式,我们可以在不修改现有类的情况下,将它们的接口转换为客户端期望的接口。这不仅避免了大量代码的修改,还提高了系统的灵活性和可扩展性。

    简而言之,适配器模式就像是一个转换器或翻译器,使得原本无法直接交流的类能够顺畅地协同工作。
  

Part 2: 桥接模式:分离抽象和实现,让它们可以独立变化 🌉

  
在这里插入图片描述
  
    桥接模式通过将抽象化与实现化解耦,使得二者可以独立变化,进而在实际的软件开发过程中,实现细节可以更灵活地应对变化。本章节将探讨桥接模式的定义、用途,以及如何在设计时利用它达到设计上的高度自由。
  

 定义

✨ 桥接模式是一种将抽象部分与实现部分分离,以便它们可以独立变化的结构型设计模式,使得两者都能进行扩展。
 

 用途

    桥接模式是一种结构型设计模式,它的主要作用是将抽象部分与实现部分分离,使得它们可以独立地变化。这种分离方式有助于增加系统的灵活性和可扩展性。

    桥接模式的用途主要体现在以下几个方面:👇

  1. 抽象与实现解耦:桥接模式通过将抽象部分与具体实现部分分离,允许它们各自独立地变化。这种解耦方式有助于减少代码之间的耦合度,使得系统更加灵活和易于维护。

  2. 支持多种实现方式:在桥接模式中,一个抽象类可以对应多个实现类。这意味着,当我们需要根据不同的需求实现不同的功能时,只需要添加新的实现类,而不需要修改原有的抽象类或代码逻辑。这大大简化了代码结构,并提高了代码的可重用性。

  3. 扩展性强:由于桥接模式允许抽象部分和实现部分独立变化,因此当需要添加新的抽象或实现时,只需要在相应的部分进行扩展,而不需要修改整个系统的结构。这种扩展性使得桥接模式在构建大型复杂系统时特别有用。

  4. 跨平台开发:桥接模式在处理跨平台开发问题时也表现出色。通过将平台相关的代码与平台无关的代码分离,我们可以轻松地在不同的平台上实现相同的功能。这大大减少了重复代码和维护成本。

    举例来说,假设我们正在开发一个图形编辑软件,其中包含了多种图形对象(如矩形、圆形等)以及多种绘制工具(如铅笔、画笔等)。在这个场景中,我们可以使用桥接模式将图形对象与绘制工具分离。具体来说,我们可以定义一个图形对象的抽象类,并为每种图形对象提供一个实现类。同时,我们可以定义一个绘制工具的接口,并为每种绘制工具提供一个实现类。这样,当我们需要添加新的图形对象或绘制工具时,只需要添加相应的实现类,而不需要修改其他部分的代码。此外,由于桥接模式的灵活性,我们还可以轻松地在不同的平台上实现相同的图形编辑功能。

    总而言之,桥接模式通过分离抽象与实现,提高了系统的灵活性和可扩展性。在需要支持多种实现方式、进行跨平台开发或构建大型复杂系统时,桥接模式是一种非常有用的设计模式。
 

Part 3: 大比拼:适配器模式 vs 桥接模式 🤼

  
在这里插入图片描述
  
    为什么选择适配器模式?在何种场景下桥接模式表现更佳?透过一系列的比较分析,本部分将深入讨论两种设计模式的结构图、使用场景、优缺点,以及它们在解决软件设计问题时的不同效果。
  

结构图 💖

  
在这里插入图片描述
  

适配器模式(图1

适配器模式的主要目的是将一个类的接口转换成客户期望的另一个接口,从而使得原本不兼容的类可以一起工作。它通常涉及到一个适配器类,该类持有对适配者类对象的引用,并通过实现目标接口来提供对适配者方法的访问。

主要角色:

  1. 目标(Target)接口:定义客户期望的接口。
  2. 适配者(Adaptee)类:现有的、需要被适配的类。
  3. 适配器(Adapter)类:实现目标接口并持有对适配者对象的引用,将请求转发给适配者。

    适配器模式的关键在于通过适配器类将目标接口与适配者类连接起来,使得客户可以透明地调用适配者类的方法,而无需知道其具体的实现细节。
  

桥接模式(图2

桥接模式的主要目的是将抽象部分与实现部分分离,使得它们可以独立地变化。它通常涉及到两个层次的结构:抽象层和实现层。抽象层定义了抽象接口,而实现层则提供了具体实现。两者之间通过桥接(Bridge)进行连接。

主要角色:

  1. 抽象(Abstraction)类:定义抽象接口,并持有一个对实现类对象的引用(即桥)。
  2. 实现(Implementor)接口:定义实现类的接口。
  3. 具体实现(Concrete Implementor)类:实现实现接口,提供具体的实现。

    桥接模式的关键在于将抽象与实现解耦,使得它们可以独立地变化和发展。抽象类通过持有对实现类对象的引用来动态地绑定到具体的实现上,从而实现了抽象与实现的分离。

  

结构上的不同 🛠️

 

  1. 关注点不同:适配器模式主要关注将一个接口适配成另一个接口,以解决接口不兼容的问题;而桥接模式则更关注将抽象与实现分离,以实现独立的变化和扩展。
  2. 连接方式不同:在适配器模式中,适配器类通过继承或引用适配者类来连接目标接口和适配者类;而在桥接模式中,抽象类通过持有对实现类对象的引用来连接抽象接口和实现接口。
  3. 灵活性不同:由于桥接模式将抽象与实现完全分离,因此它在处理变化时更加灵活。可以独立地增加新的抽象类或实现类,而不需要修改原有的代码。而适配器模式在处理变化时可能需要修改适配器类或适配者类,以适应新的接口需求。
  4. 设计复杂度不同:桥接模式的设计相对复杂,需要正确地识别出系统中两个独立变化的维度,并设计相应的抽象类和实现类。而适配器模式的设计相对简单,只需要定义一个适配器类来连接目标接口和适配者类即可。

    适配器模式和桥接模式在结构上存在一些明显的不同。适配器模式更注重接口的适配和兼容性,而桥接模式更注重抽象与实现的分离和灵活性。在实际应用中,应根据具体的需求和场景选择合适的设计模式。

  

使用场景 🚀

  
在这里插入图片描述
  

优缺点 🎭

  
在这里插入图片描述
  
    综上所述,适配器模式和桥接模式都是常用的设计模式,它们各自有适用的场景和优缺点。在选择使用哪种模式时,需要根据具体的软件设计问题和需求来进行权衡和决策。如果需要解决两个已有接口之间的匹配问题,可以考虑使用适配器模式;如果需要在抽象和实现之间增加灵活性,特别是当抽象和实现都需要独立变化时,可以考虑使用桥接模式。
  

Part 4: 易混场景💔

  

场景:图形渲染系统

✨ 假设我们正在开发一个图形渲染系统,该系统需要支持多种不同类型的图形(如圆形、矩形、自定义图形等)和多种渲染方式(如软件渲染、硬件加速渲染等)。这个系统应该能够灵活地添加新的图形类型和渲染方式,而不需要修改现有的代码。
  

使用适配器模式实现:让不兼容的接口找到共同语言 🤔

  
    在这个场景中,我们可以将每种图形类型看作是一个适配者(Adaptee),而将渲染方式看作是客户端期望的接口(Target)。适配器(Adapter)则负责将图形类型的接口适配到渲染方式所需的接口上。
  

  实现

  1. 定义渲染接口(Target):首先,我们定义一个渲染接口,它包含了渲染图形所需的方法。
  2. 实现图形类(Adaptee):然后,我们为每种图形类型实现一个类,这些类具有各自特有的属性和方法。
  3. 创建适配器类(Adapter):接下来,我们为每种图形类型创建一个适配器类。适配器类实现了渲染接口,并持有对相应图形类对象的引用。适配器类中的方法会将渲染请求转发给图形类对象,并在必要时进行接口转换。
  4. 客户端调用:客户端代码通过渲染接口调用适配器类的方法,从而实现对不同图形类型的渲染。

  优点

  1. 灵活性:适配器模式允许将不兼容的接口进行适配,使得原本无法协同工作的类能够一起工作。这提供了很大的灵活性,特别是在面对不断变化的渲染方式时。
  2. 复用性:现有的图形类可以被复用,而不需要进行大量修改。适配器类负责处理接口之间的转换,使得原有的图形类可以继续发挥作用。
  3. 透明性:对于客户端来说,使用适配器模式可以使得接口转换变得透明。客户端只需要调用适配器提供的接口,而不需要关心具体的实现细节。

  缺点

  1. 设计复杂度:适配器模式可能会增加系统的设计复杂度。需要仔细考虑如何设计适配器类,以确保它能够正确地转换接口。
  2. 代码可读性:过度使用适配器模式可能会导致代码变得难以理解和维护。因为系统中会存在大量的适配器类,它们之间的关系可能会变得非常复杂。
  3. 性能开销:适配器模式可能会引入额外的性能开销。因为接口转换需要额外的计算和处理,特别是在处理大量图形渲染请求时,这可能会成为性能瓶颈。
      

    Java实现如下:(详见:深入了解适配器模式-优雅地解决接口不匹配问题

// 渲染接口  
interface Renderer {  void render();  
}  // 圆形类(Adaptee)  
class Circle {  public void draw() {  System.out.println("Drawing Circle");  }  
}  // 圆形渲染适配器(Adapter)  
class CircleRendererAdapter implements Renderer {  private Circle circle;  public CircleRendererAdapter(Circle circle) {  this.circle = circle;  }  @Override  public void render() {  circle.draw();  System.out.println("Circle has been rendered using Adapter Pattern");  }  
}  // 客户端代码  
public class AdapterPatternDemo {  public static void main(String[] args) {  Circle circle = new Circle();  Renderer renderer = new CircleRendererAdapter(circle);  renderer.render();  }  
}

  

使用桥接模式:分离抽象和实现,让它们可以独立变化 😉

    在这个场景中,我们可以将图形类型和渲染方式看作是两个独立变化的维度。抽象类(Abstraction)负责定义图形的通用接口,并持有一个对实现类(Implementor)的引用,以实现图形的渲染。

  实现

  1. 定义实现接口(Implementor):首先,我们定义一个渲染接口(实现接口),它包含了渲染图形所需的方法。
  2. 实现具体渲染类(Concrete Implementor):然后,我们为每种渲染方式实现一个类,这些类实现了渲染接口。
  3. 定义抽象图形类(Abstraction):接下来,我们定义一个抽象图形类,它包含了图形的通用属性和方法,并持有一个对渲染接口对象的引用(即桥)。抽象图形类中的方法会使用渲染接口对象来进行图形的渲染。
  4. 实现具体图形类(Refined Abstraction):然后,我们为每种图形类型实现一个具体图形类,这些类继承自抽象图形类,并提供了具体图形的实现。
    客户端调用:客户端代码通过创建具体图形类和具体渲染类的对象,并将它们组合在一起,从而实现对不同图形类型的渲染。

  优点

  1. 分离抽象和实现:桥接模式将抽象部分和实现部分完全分离,使得它们可以独立地变化和发展。这提供了更好的解耦和组合性。
  2. 扩展性:桥接模式使得系统更容易扩展。无论是增加新的图形类型还是新的渲染方式,都不需要修改现有的代码,只需要增加相应的具体类即可。
  3. 灵活性:桥接模式提供了更大的灵活性。不同的图形类型和渲染方式可以任意组合,以满足不同的需求

  缺点

  1. 设计复杂度:桥接模式的设计相对复杂。需要正确地识别出系统中两个独立变化的维度,并设计相应的抽象类和实现类。这需要对系统有深入的理解和分析。
  2. 理解难度:对于初学者来说,桥接模式可能较难理解。因为它涉及到抽象类、实现类以及它们之间的关系,需要一定的抽象思维能力才能掌握。
  3. 可能增加开发成本:由于桥接模式的设计复杂度较高,因此可能会增加系统的开发成本。需要投入更多的时间和精力来设计和实现相应的类及其关系。
      

    Java实现如下:(详见:用桥接模式构建可扩展的软件系统

// 渲染接口(Implementor)  
interface DrawingAPI {  void drawCircle(int x, int y, int radius);  
}  // 软件渲染实现  
class SoftwareDrawingAPI implements DrawingAPI {  @Override  public void drawCircle(int x, int y, int radius) {  System.out.println("Drawing circle at (" + x + "," + y + ") with radius " + radius + " using Software Rendering");  }  
}  // 硬件渲染实现  
class HardwareDrawingAPI implements DrawingAPI {  @Override  public void drawCircle(int x, int y, int radius) {  System.out.println("Drawing circle at (" + x + "," + y + ") with radius " + radius + " using Hardware Accelerated Rendering");  }  
}  // 抽象图形类(Abstraction)  
abstract class Shape {  protected DrawingAPI drawingAPI;  protected Shape(DrawingAPI drawingAPI) {  this.drawingAPI = drawingAPI;  }  public abstract void draw();  public void resize() {  System.out.println("Resizing shape");  }  
}  // 具体圆形类(Refined Abstraction)  
class CircleShape extends Shape {  private int x, y, radius;  public CircleShape(int x, int y, int radius, DrawingAPI drawingAPI) {  super(drawingAPI);  this.x = x;  this.y = y;  this.radius = radius;  }  @Override  public void draw() {  drawingAPI.drawCircle(x, y, radius);  }  
}  // 客户端代码  
public class BridgePatternDemo {  public static void main(String[] args) {  DrawingAPI softwareDrawingAPI = new SoftwareDrawingAPI();  Shape circleSoftware = new CircleShape(50, 100, 30, softwareDrawingAPI);  circleSoftware.draw();  circleSoftware.resize();  DrawingAPI hardwareDrawingAPI = new HardwareDrawingAPI();  Shape circleHardware = new CircleShape(50, 100, 30, hardwareDrawingAPI);  circleHardware.draw();  circleHardware.resize();  }  
}

  

决择 😅

  
    适配器模式和桥接模式在图形渲染系统的场景中都有各自的优缺点。选择哪种模式取决于具体的需求和设计目标。如果更注重灵活性和复用性,可以选择适配器模式;如果更注重解耦和扩展性,可以选择桥接模式。
    在场景中,适配器模式和桥接模式都可以用来实现灵活性和可扩展性。选择哪种模式取决于设计的侧重点和需求

  1. 如果我们更关注于将现有组件(图形类)适配到新的接口(渲染方式)上,并且希望在不修改现有代码的情况下增加新的渲染方式,那么适配器模式可能更合适。
  2. 如果我们更关注于将抽象(图形类)与实现(渲染方式)分离,并且希望能够独立地扩展图形类型和渲染方式,那么桥接模式可能更合适。桥接模式提供了更好的解耦和组合性,使得我们可以更灵活地组合不同的图形类型和渲染方式。
      

🔥 结论与行动呼吁 💖

  
在这里插入图片描述

  

    在软件设计的世界里,每一个模式都像是一块精心雕琢的积木,为构建稳固且灵活的软件架构提供了不可或缺的组件。当我们谈到适配器模式和桥接模式时,这两块积木尤为重要,它们能够助您游刃有余地应对软件开发中的种种挑战,引领您走向更加创新和变革的道路。👍
  

    适配器模式,顾名思义,它的作用就像是一个转换器,将原本不兼容的接口进行适配,使之能够协同工作。想象一下,在软件项目中,您可能会遇到各种已有的类或库,它们的接口并不符合当前项目的需求。这时,适配器模式就能派上用场,让您无需改动原有的代码,只需编写一个适配器类,即可将不兼容的接口转化为项目所需的接口。这种灵活性不仅降低了维护成本,还提高了代码的可重用性。🧐
  

    桥接模式,则更注重于抽象与实现的分离。它让抽象部分和实现部分独立地变化,降低了它们之间的耦合度。这意味着,当您需要增加新的抽象类或实现类时,只需在各自的层次上进行扩展,而无需改动其他部分的代码。这种分离使得软件架构更加清晰、易于维护,同时也为未来的扩展和修改留下了足够的空间。 🤔
  

    掌握了这两种模式,您就像拥有了一双巧手,能够在软件开发的舞台上编织出更加精彩的作品。无论是面对复杂多变的业务需求,还是应对日新月异的技术革新,您都能凭借这些模式,构建出既稳定又灵活的软件架构。⭐
  

    现在,是时候把这些知识应用到实践中去了!不要害怕尝试新的设计模式,它们将为您的软件开发之旅注入新的活力。就像那激励人心的创新与变革的象征图一样,鼓励您勇于探索、敢于创新。把适配器模式和桥接模式加入您的设计工具箱,让它们成为您构建优雅软件架构的得力助手。😉
  

    👏 让我们一起迈向更加精彩的软件设计之路吧!在此助您在软件设计的海洋中乘风破浪。 🚢

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

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

相关文章

ElasticSearch - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

Linux--Ubuntu安装

Linux操作系统时程序员必须要学的操作系统。接下来我们就来看一下Linux操作系统是如何安装的 我们在 Vmware 虚拟机中安装 linux 系统&#xff0c;所以需要先安装 vmware 软件&#xff0c;然后再 安装 Linux 系统。 一.所需安装文件&#xff1a; Vmware 下载地址(现在最新版的…

羊大师揭秘,孩子适不适合喝羊奶?

羊大师揭秘&#xff0c;孩子适不适合喝羊奶&#xff1f; 羊奶&#xff0c;这个古老而珍贵的营养饮品&#xff0c;近年来在家长们中间逐渐走红。它以其独特的营养价值和口感受到了众多家庭的青睐。但是&#xff0c;面对市面上琳琅满目的羊奶产品&#xff0c;家长们常常陷入选择…

三连杆滑块机构运动学仿真 | 【Matlab源码+理论公式文本】|曲柄滑块 | 曲柄连杆 | 机械连杆

【程序简介】&#x1f4bb;&#x1f50d; 本程序通过matlab实现了三连杆滑块机构的运动学仿真编程&#xff0c;动态展现了三连杆机构的运动动画&#xff0c;同时给出了角位移、角速度和角加速度的时程曲线&#xff0c;除了程序本身&#xff0c;还提供了机构运动学公式推导文档…

网络——入门基础

目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网&#xff0c;什么是广域网&#xff0c;我这里就不过多赘述了&#xff0c;我们直接来谈一下什么…

【链表】Leetcode 24. 两两交换链表中的节点【中等】

两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例1: 输入&#xff1a;head [1,2,3,4] 输出&#…

用连续自然数之和来表达整数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 该整数的所有表达式…

java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics

今天在使用springBoot连接influxdb报错 java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 详细报错如下&#xff0c;提出我们缺少一个依赖 原因是由于创建influxdb客户端缺少Kotlin运行时库 解决办法就是 1.显示的添加okhttp的依赖 <dependency>…

my2sql —— go语言版binlog解析及闪回工具

之前学习过python语言版binlog解析及闪回工具 MySQL闪回工具简介 及 binlog2sql工具用法 最近听同事介绍有了新的go语言版的my2sql。优点是不需要安装一大堆依赖包&#xff0c;直接可以安装使用&#xff0c;并且解析更高效&#xff0c;试用一下。 一、 下载安装 1. 软件下载 …

5分钟教你使用idea调试SeaTunnel自定义插件

在用Apache SeaTunnel研发SM2加密组件过程中&#xff0c;发现社区关于本地调试SeaTunnel文章过于简单&#xff0c;很多情况没有说明&#xff0c;于是根据自己遇到问题总结这篇文档。SeaTunnel本地调试官方文档&#xff0c;希望对大家有所帮助&#xff01; 使用的引擎为Flink(不…

极路由4获取不到local_token和uuid的解决方案

今天淘了个二手极路由4(HC5962)&#xff0c;想刷个Openwrt系统来着&#xff0c;就按着网上的教程来进行。 打开极路由ROOT local-ssh利用工具 (hiwifi.wtf)这个网站&#xff0c;然后第一步获取local_token就出问题了&#xff0c;显示的字是"找不到文件..."&#xff…

C/C++炸弹人游戏

参考书籍《啊哈&#xff0c;算法》&#xff0c;很有意思的一本算法书&#xff0c;小白也可以看懂&#xff0c;详细见书&#xff0c;这里只提供代码和运行结果。 这里用到的是枚举思想&#xff0c;还有更好地搜索做法。 如果大家有看不懂的地方或提出建议&#xff0c;欢迎评论区…

前端基础篇-深入了解 Ajax 、Axios

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互是指&#xff0c;可以在不…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

演讲恐惧症?别怕!这3招帮你克服舞台紧张

演讲恐惧症&#xff1f;别怕&#xff01;这3招帮你克服舞台紧张 在人生的舞台上&#xff0c;演讲往往被视为展现个人才华、传递思想观点的重要平台。然而&#xff0c;对于许多人来说&#xff0c;站在舞台上却成为了一种难以克服的恐惧。演讲恐惧症&#xff0c;这个看似微不足道…

PMP备考心得 | 策略与技巧大揭秘

1.理解考试大纲&#xff1a;首先&#xff0c;你需要熟悉PMP考试的内容和结构。PMI官网提供了详细的考试大纲&#xff0c;包括项目管理的五个过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;和十个知识领域&#xff1b; 2.制定学习计划&#xff1a;根据个人的时间…

发布镜像到阿里云仓库

发布上一篇Dockerfile实战-自定义的centos镜像。 1、登录阿里云 2、找到容器镜像服务 3、创建命令空间 4、创建镜像仓库 5、点击进入这个镜像仓库&#xff0c;可以看到所有的信息 6、根据操作指南测试推送发布 6.1登录阿里云 [rootzhoujunru home]# docker login --usernam…

【MySQL】锁信息

title: MySQL 锁信息 tags: MySQL abbrlink: 364637211 date: 2021-07-26 18:34:34 1 MySQL 锁定义 MySQL 锁&#xff08;Lock&#xff09;是数据库管理系统用于管理并发访问的一种机制。 在多用户同时访问数据库的环境下&#xff0c;可能会出现多个事务同时对相同的数据进行…

【工具】Docker 入门及常用指令

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;为祖国的科技进步添砖Java 个性签名&#xff1a;保留赤子之心也许是种幸运吧 目录 1. 什么是 Docker &#xff1f; 2. Docker 安装 3. Docker 镜像 4. Docker 容器 4.1 运行容器 4.2 查看正在运行的容器 4…

milvus安装

milvus安装 sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose- $ (uname -s)- $ (uname -m)” -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/…