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

在这里插入图片描述​🌈 个人主页: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. 如果我们更关注于将抽象(图形类)与实现(渲染方式)分离,并且希望能够独立地扩展图形类型和渲染方式,那么桥接模式可能更合适。桥接模式提供了更好的解耦和组合性,使得我们可以更灵活地组合不同的图形类型和渲染方式。
      

🔥 结论与行动呼吁 💖

  
在这里插入图片描述

  

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day16-【Java SE进阶】IO流(二):字符流、缓冲流、转换流、打印流、数据流、序列化流、IO框架

一. 字符流 字节流&#xff1a;适合复制文件等&#xff0c;不适合读写文本文件 字符流&#xff1a;适合读写文本文件内容 1. FileReader(文件字符输入流) 作用:以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中去。读取单个字符&#xff0c;性能比较差&a…

【位运算】【 数学】【 哈希映射】2857. 统计距离为 k 的点对

本文涉及知识点 位运算 数学 哈希映射 LeetCode 2857. 统计距离为 k 的点对 给你一个 二维 整数数组 coordinates 和一个整数 k &#xff0c;其中 coordinates[i] [xi, yi] 是第 i 个点在二维平面里的坐标。 我们定义两个点 (x1, y1) 和 (x2, y2) 的 距离 为 (x1 XOR x2) …

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

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

【C语言】基本语法知识C语言函数操作符详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.基本语法 1.1 代码解释 1.1.1 main()主函数 1.1.2 int 1.1.3 { } 1.1.4 printf()库函数 1.1.5 stdio.h头文件 1.2 C语言的…

突破边界:Web3开启数字化社会的新纪元

引言 随着科技的不断进步和数字化社会的发展&#xff0c;Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态&#xff0c;Web3具有突破传统边界、实现去中心化的特点&#xff0c;被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景&#xf…

VueUse常见方法使用

npm i vueuse/core 1、useDebounceFn 节流防抖 import { useDebounceFn } from vueuse/core<button type"button" class"search" click"query">查询</button>// 查询 获取table数据const query2 async () > {try {const res …

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…

latex如何对一段文本进行加粗

在LaTeX中&#xff0c;你可以使用\textbf{}命令来对一段文本进行加粗。例如&#xff1a; \textbf{这是要加粗的文本}这将会把"这是要加粗的文本"这段文字显示为加粗。 如果你想要对整段文本进行加粗&#xff0c;你可以将整段文本都放在\textbf{}命令中&#xff0c;…

jsp学习

1.新建文件&#xff0c;创建web动态项目 2.项目点击next两下&#xff0c;点击勾选gentear&#xff0c;点击finish 3.文件成功后是有jsp文件 4.在webapp新建jsp文件 5. 使用模板html5建立文件 <% page language"java" contentType"text/html; charsetUTF-8&qu…

西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)

前言 在学习到这部分时&#xff0c;对 ℓ-rank 以及AUC的关系难以理解透彻&#xff0c;在网上看到其他博主也并未弄明白&#xff0c;大家大多写自己的理解&#xff0c;我希望您在看完这篇文章时能够深刻理解这二者的关系&#xff0c;如果我的理解有误&#xff0c;希望您在评论…

数据结构 之 二叉树

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

python网络爬虫实战教学——urllib的使用(1)

文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

mysql 数据库 基本介绍

一 数据 &#xff08;一&#xff09;数据是什么 描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录气 以“记录”形式按统一的格式进行存储 &#xff08;二&#xff09;数据的分类 1&#xff0c;结构化的数据 即有固定格式和有限长度的数据。例…

01_Kubernetes基础

Kubernetes为什么叫K8S&#xff1a;因为K和S之间有8个字母 为什么需要K8S 对于云计算来说有自己的交互标准 Paas的下一代标准就是容器化&#xff0c;容器的集群化有没有很好的方案&#xff1f;有需求就会有产品&#xff0c;这个产品就叫做资源管理器。 首先是Apache的MESOS&…

Linux虚拟主机默认隐藏文件,如何开启显示

收到一位用户反馈他买了Hostease Linux虚拟主机&#xff0c;想要知道主机默认隐藏文件如何开启。据悉目前大部分主机提供商出售的Linux虚拟主机带的都是cPanel面板&#xff0c;因此开启隐藏文件操做需要进入到cPanel面板。操做步骤如下&#xff1a; 1.首先需要先登陆cPanel面板…

深度强化学习03价值学习

Q*类似于先知&#xff0c;知道动作的后果 价值学习是得到一个近似的价值函数

【Linux】Linux安装软件---软件包管理器 yum

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…

如何构建Docker自定义镜像

说明&#xff1a;平常我们使用Docker运行各种容器&#xff0c;极大地方便了我们对开发应用的使用&#xff0c;如MySQL、Redis&#xff0c;以及各种中间件&#xff0c;使用时只要拉镜像&#xff0c;运行容器即可。本文介绍如何创建一个Demo&#xff0c;自定义构建一个镜像。 开…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中&#xff0c;智能电视规模已经过半&#xff0c;OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表&#xff0c;酷开科技一直聚焦大屏端数据研究&#xff0c;目前已经形成一套基于大屏指数的智慧营销体系&#xff0c;让OTT大屏的数字营销化水平实现…

开源工具专题-02 Confluence企业级wiki

开源工具专题-02 Confluence企业级wiki 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-3-20 csdn 博客名称&#xff1a;五维空间-影子&#xf…