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

在这里插入图片描述​🌈 个人主页: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/761793.shtml

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

相关文章

Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)

背景 本文基于Spark 3.5.0 目前公司在做小文件合并的时候用到了 Spark Rebalance 这个算子&#xff0c;这个算子的主要作用是在AQE阶段的最后写文件的阶段进行小文件的合并&#xff0c;使得最后落盘的文件不会太大也不会太小&#xff0c;从而达到小文件合并的作用&#xff0c;…

sentinel熔断规则详解

1、慢调用降级熔断 1.1、参数详解 最大RT&#xff1a;调用接口的最大时间。 比例阈值&#xff1a;超过了最大RT调用时间的请求的比例。 熔断时长&#xff1a;触发熔断后&#xff0c;熔断的时间 最小请求数据&#xff1a;每秒最少的请求数量&#xff0c;只有大于等于这个数…

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

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;六&#xff09; 下一篇&#xff1a; 无 33、sqlite3_column_table_name 函数 sqlite3_column_table_name 用于返回结果集中指定列所属的表的名称。如果查询中列使…

前端案例:产品模块

文章目录 产品模块效果结构布局分析父级盒子布局图片和段落评价和详情 产品模块效果 结构布局分析 1、大的父级盒子包含全部的内容 2、内容装入 图片&#xff08;img标签&#xff09;&#xff1b;分别三个子盒子装入两段评价以及商品信息。 父级盒子布局 div {width: 300px…

网络通信——IP地址、端口号、协议(TCP、UDP)

通信架构 网络通信三要素 IP地址 IPv4地址 IPv6地址 IP域名 IP常识 端口号 概念 协议 开放式网络互联标准&#xff1a;OSI、TCP/IP 传输层的2个通信协议——UDP、TCP TCP协议&#xff1a;三次握手建立建立可靠连接 进行三次握手的原因&#xff1a;为了确保客户端和服务端…

实时数仓之实时数仓架构(Doris)

目前比较流行的实时数仓架构有两类,其中一类是以Flink+Doris为核心的实时数仓架构方案;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对Flink+Doris架构进行介绍,这套架构的特点是组件涉及相对较少,架构简单,实时性更高,且易于Lambda架构实现,Doris本身可以支…

R语言Meta分析核心技术:回归诊断与模型验证

R语言作为一种强大的统计分析和绘图语言&#xff0c;在科研领域发挥着日益重要的作用。其中&#xff0c;Meta分析作为一种整合多个独立研究结果的统计方法&#xff0c;在R语言中得到了广泛的应用。通过R语言进行Meta分析&#xff0c;研究者能够更为准确、全面地评估某一研究问题…

安卓studio连接手机之后,一两秒之后就自动断开了。问题解决。

太坑了&#xff0c;安卓studio链接手机之后。几秒之后就断开了。我以为是adb的问题&#xff0c;就重新安装了一下adb。并且在环境变量中配置了Path的路径。然而并没有什么用啊。 后来查看是wps的服务和ADB有冲突。直接把WPS卸载掉之后就没有出现链接手机闪现的的问题。

基于python+vue研究生志愿填报辅助系统flask-django-php-nodejs

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

阿里云国际该如何设置DDoS高防防护策略?

DDoS高防提供针对网络四层DDoS攻击的防护策略设置功能&#xff0c;例如虚假源和空连接检测、源限速、目的限速&#xff0c;适用于优化调整非网站业务的DDoS防护策略。在DDoS高防实例下添加端口转发规则&#xff0c;接入非网站业务后&#xff0c;您可以单独设置某个端口的DDoS防…

Hive SQL必刷练习题:留存率问题(*****)

留存率&#xff1a; 首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总…

蓝桥杯STM32 G431 hal库开发速成——输入捕获

蓝桥杯的输入捕获较为简单&#xff0c;基本不涉及溢出的问题。所以这里就不介绍溢出了。文末有源码。 一、Cubemx配置 二、代码编写 1.在捕获回调函数中 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {if(htim->InstanceTIM3){switch(count){case 1:{jishu1…

如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?

如何让标题1和标题2不一样&#xff1f; 修改根目录下的App.vue&#xff08;核心代码如下&#xff09; <script>export default {onLaunch() {// 监听各种跳转----------------------------------------[navigateTo, redirectTo, reLaunch, switchTab, navigateBack, ].…

【JSON2WEB】10 基于 Amis 做个登录页面login.html

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

《云计算:数字时代的引擎》

在数字化时代&#xff0c;云计算技术以其强大的计算能力和灵活的应用方式&#xff0c;成为推动各行各业发展的引擎。本文将围绕云计算的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势进行详细探讨。 云计算的技术进展 云计算的技术进展涵盖了多个方面&…

python(django)之产品后台管理功能实现

1、添加新项目 在命令行输入以下代码 python manage.py startapp prroduct 2、添加路径和代码结构 在新项目目录下admin.py中加入以代码 from .models import Product class ProductAdmin(admin.ModelAdmin):list_display [product_name, product_desc,producter,created_…

基于Springboot的闲置图书分享(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的闲置图书分享&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

Linux服务器导出CPU和内存使用情况

Linux服务器默认存储一个月的CPU和内存记录&#xff0c;所在目录&#xff1a;/var/log/sa/&#xff0c;如下图所示 在此用sar命令来执行 sar是一个比较全面的性能监控工具&#xff0c;包括cpu、内存、磁盘和网络等信息&#xff0c;并且该命令会每10分钟自动保存一次硬件资源使用…

odoo扩展导出pdf功能

1. 说明: odoo原生导出功能扩展导出pdf文件功能, 如有额外需求请联系博主 2. 版本说明: odoo版本: odoo15 其他odoo版本未进行测试,如有需要自行测试 3. 地址: 该补丁代码放在github仓库, 地址: https://github.com/YSL-Alpaca/odoo_export_pdf 4. 改补丁依赖于第三方软件wkh…

ubuntu20.04搭建nginx rtmp视频服务到指定位置解决权限不足

1.安装依赖 apt-get install build-essential libpcre3 libpcre3-dev libssl-dev2.建一个目录 mldir rtmp_nginx 3.源码下载 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip4.解压缩 tar -xf ng…