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

在这里插入图片描述​🌈 个人主页: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.rhkb.cn/news/284229.html

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

相关文章

C语言——字符函数

前言 字符函数是C语言中专门用来处理字符的函数&#xff0c;再C语言中&#xff0c;我们有时需要大量的处理有关字符的问题&#xff0c;所以字符函数就由此应运而生&#xff0c;接下来我来为大家简单介绍一下字符函数。 一.字符分类函数 函数如果它的参数满足下列条件就返回真…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一&#xff0c;Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为&#xff0c;还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据&#xff0c;构建了强大的大数据应用系统&…

AbstractQueuedSynchronizer 独占式源码阅读

概述 ● 一个int成员变量 state 表示同步状态 ● 通过内置的FIFO队列来完成资源获取线程的排队工作 属性 AbstractQueuedSynchronizer属性 /*** 同步队列的头节点 */private transient volatile Node head;/*** 同步队列尾节点&#xff0c;enq 加入*/private transient …

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 概述 深度神经网络&#xff08;Deep Neural Network…

web前端之行为验证码、不同设备和屏幕尺寸呈现不同大小、元素宽度根据视口宽度进行调整、元素或图片裁剪、图片验证码

MENU 前言版本一(htmlJScss)版本二(htmlJScsscanvas) 前言 1、版本一的样式比较齐全&#xff1b; 2、版本二的JS逻辑和功能效果比较完善&#xff0c;且是别人的代码&#xff0c;后续会对样式进行完善。[Gitee | 哔哩哔哩]&#xff1b; 3、两个版本各有千秋&#xff0c;主要学习…

HTTPS协议的工作原理:保护网络通信的安全盾牌

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【深度学习】四种天气分类 模版函数 从0到1手敲版本

引入该引入的库 import torch import torch.nn as nn import matplotlib.pyplot as plt import torch.nn.functional as F import torchvision import torch.optim as optim %matplotlib inline import os import shutil import glob os.environ["KMP_DUPLICATE_LIB_OK&q…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

微服务高级篇(一):微服务保护+Sentinel

文章目录 一、初识Sentinel1.1 雪崩问题及解决方案1.2 微服务保护技术对比1.3 Sentinel介绍与安装1.4 微服务整合Sentinel 二、Sentinel的流量控制三、Sentinel的隔离与降级四、Sentinel的授权规则五、规则持久化5.1 规则管理模式【原始模式、pull模式、push模式】5.2 实现push…

Spark-Scala语言实战(4)

在之前的文章中&#xff0c;我们学习了如何在scala中定义无参&#xff0c;带参以及匿名函数。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言…

基础:TCP四次挥手做了什么,为什么要挥手?

1. TCP 四次挥手在做些什么 1. 第一次挥手 &#xff1a; 1&#xff09;挥手作用&#xff1a;主机1发送指令告诉主机2&#xff0c;我没有数据发送给你了。 2&#xff09;数据处理&#xff1a;主机1&#xff08;可以是客户端&#xff0c;也可以是服务端&#xff09;&#xff0c…

LM studio使用gemmar聊天小试

通过LM studio可以方便的使用各种模型&#xff0c;使用LM提供的chat界面或者是使用python代码。 试试代码 在windows下使用python简单一试&#xff0c;例子直接复制LM界面上的代码&#xff1a; 用pip安装 openai包在LM界面 Start Server 需要安装 openai包。 本地电脑是I7…

图像处理ASIC设计方法 笔记12 图像旋转ASIC中心控制器状态机

P109 1 流水线图像旋转ASIC整体架构 中心控制器负责各个模块的状态控制和数据调度,接收到外部启动信号后,进人芯片初始化阶段,片上FIFO接收外部输入的图像旋转参数、接收完毕后,再利用接收到的旋转角度到查找表中找到对应的正弦和正切值。 中心控制器将接收到的行列信息…

计算机网络——26通用转发和SDN

通用转发和SDN 网络层功能&#xff1a; 转发&#xff1a; 对于从某个端口 到来的分组转发到合适的 输出端口路由&#xff1a; 决定分组从源端 到目标端的路径 网络层 传统路由器的功能 每个路由器(Per Route)的控制平面 &#xff08;传统&#xff09; 每个路由器上都有实…

阿里云原生:如何熟悉一个系统

原文地址:https://mp.weixin.qq.com/s/J8eK-qRMkmHEQZ_dVts9aQ?poc_tokenHMA-_mWjfcDmGVW6hXX1xEDDvuJPE3pL9-8uSlyY 导读&#xff1a;本文总结了熟悉系统主要分三部分&#xff1a;业务学习、技术学习、实战。每部分会梳理一些在学习过程中需要解答的问题&#xff0c;这些问题…

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性&#xff1f; 首先分离属性是线程的一个属性&#xff0c;有了分离属性的线程&#xff0c;不需要别的线程去接合…

STM32---DHT11温湿度传感器与BH1750FVI光照传感器(HAL库、含源码)

写在前面&#xff1a;本节我们学习使用两个常见的传感器模块&#xff0c;分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用&#xff0c;因为其使用简单方便&#xff0c;所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

相交链表:寻找链表的公共节点

目录 一、公共节点 二、题目 三、思路 四、代码 五、代码解析 1.计算长度 2.等长处理 3.判断 六、注意点 1.leetcode的尿性 2.仔细观察样例 3.经验总结 一、公共节点 链表不会像两直线相交一样&#xff0c;相交之后再分开。 由于单链表只有一个next指针&#xff0…

STM32 CAN的工作模式

STM32 CAN的工作模式 正常模式 正常模式下就是一个正常的CAN节点&#xff0c;可以向总线发送数据和接收数据。 静默模式 静默模式下&#xff0c;它自己的输出端的逻辑0数据会直接传输到它自己的输入端&#xff0c;逻辑1可以被发送到总线&#xff0c;所以它不能向总线发送显性…

FANUC机器人零点标定的基本步骤(出厂数据)

FANUC机器人零点标定的基本步骤(出厂数据) FANUC 零点数据存在问题的机器人通常会出现以下几种报警: (1)SRVO-062报警 - 脉冲编码器数据丢失,机器人完全不能动,具体消除方法可参考以下链接中的内容: FANUC机器人SRVO-062报警原因分析及处理对策 (2)SRVO-075报警 -…