当前位置: 首页 > news >正文

10.桥接模式设计思想

10.桥接模式设计思想

目录介绍
  • 01.桥接模式基础
    • 1.1 桥接模式由来
    • 1.2 桥接模式定义
    • 1.3 桥接模式场景
    • 1.4 桥接模式思考
    • 1.5 解决的问题
  • 02.桥接模式实现
    • 2.1 罗列一个场景
    • 2.2 桥接结构
    • 2.3 桥接基本实现
    • 2.4 有哪些注意点
  • 03.桥接实例演示
    • 3.1 需求分析
    • 3.2 代码案例实现
    • 3.3 是否可以优化
    • 3.4 桥接设计
    • 3.5 演变代码案例
  • 04.桥接实现方式
    • 4.1 继承和组合
    • 4.2 接口和内部类
  • 05.桥接模式分析
    • 5.1 桥接模式优点
    • 5.2 桥接模式缺点
    • 5.3 适用环境
    • 5.4 模式拓展
  • 06.外观代理总结
    • 6.1 总结一下学习
    • 6.2 更多内容推荐

推荐一个好玩网站

一个最纯粹的技术分享网站,打造精品技术编程专栏!编程进阶网

https://yccoding.com/

01.桥接模式基础

1.0 本博客AI摘要

本文介绍了桥接模式的设计思想和实现方法。桥接模式通过将抽象部分与实现部分分离,使它们可以独立变化,解决了多层继承带来的复杂性和耦合性问题。文章详细讲解了桥接模式的由来、定义、应用场景和实现步骤,并通过具体实例演示了如何在支付场景中使用桥接模式。此外,还讨论了桥接模式的优缺点及其适用环境,提供了丰富的代码示例和进一步学习的资源链接。

1.1 桥接模式由来

设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:

  1. 第一种设计方案是为每一种形状都提供一套各种颜色的版本。
  2. 第二种设计方案是根据实际需要对形状和颜色进行组合。

对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

1.2 桥接模式定义

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

1.3 桥接模式场景

在实际应用中有许多场景,以下是一些常见的应用场景:更多内容

  1. 图形界面库:桥接模式可以用于图形界面库中的控件和主题的组合。
  2. 数据库访问层:桥接模式可以用于数据库访问层中的数据库连接和数据库驱动的组合。
  3. 消息传输协议:桥接模式可以用于消息传输协议中的消息和传输方式的组合。消息可以作为抽象部分,传输方式可以作为实现部分,通过桥接模式可以实现不同消息和传输方式的组合,而不需要修改消息传输协议的代码。
  4. 音频和视频播放器:桥接模式可以用于音频和视频播放器中的播放器和解码器的组合。

1.4 桥接模式思考

当我们思考桥接模式时,以下几个方面值得考虑:

  1. 系统的抽象和实现:首先,我们需要确定系统中的抽象部分和实现部分。抽象部分是指高层次的业务逻辑或功能,而实现部分是指底层的具体实现或细节。确定这两个部分有助于我们理解系统的结构和关系。
  2. 动态选择和切换:桥接模式允许在运行时动态地选择和切换不同的实现。我们需要思考如何实现这种动态性,以及如何在系统中进行实际的选择和切换。
  3. 解耦和灵活性:桥接模式的主要目标是解耦抽象和实现,使它们可以独立地变化。我们需要思考如何通过桥接模式来实现解耦,以及如何提高系统的灵活性和可维护性。

1.5 解决的问题

桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效的控制了系统中类的个数 (避免了继承层次的指数级爆炸)。更多内容

02.桥接模式实现

2.1 罗列一个场景

假设有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和方形Square。

你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。

但是,由于你已有两个子类,所以总共需要创建四个类才能覆盖所有组合,例如蓝色圆形Blue-Circle和红色方形Red-Square。在层次结构中新增形状和颜色将导致代码复杂程度指数增长。在这种情况下,桥接模式就能起到作用,它将形状和颜色解耦,使得两者可以相对独立地变化。

2.2 桥接结构

桥接模式包含如下角色:

  1. Abstraction:抽象类。主要负责定义出该角色的行为,并包含一个对实现化对象的引用。
  2. RefinedAbstraction:扩充抽象类。是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. Implementor:实现类接口。定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。
  4. ConcreteImplementor:具体实现类。给出实现化角色接口的具体实现。

2.3 桥接基本实现

首先,我们创建一个抽象类 Shape,它有一个抽象方法 draw():更多内容

public abstract class Shape {public abstract void draw();
}

然后,我们创建两个实现了 Shape 接口的具体类:Circle 和 Square:

public class Circle extends Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}public class Square extends Shape {@Overridepublic void draw() {System.out.println("画一个正方形");}
}

接下来,我们创建一个桥接类 Color,它也实现了 Shape 接口,并持有一个 Shape 类型的引用:

public class Color extends Shape {private Shape shape;public Color(Shape shape) {this.shape = shape;}@Overridepublic void draw() {setColor();shape.draw();resetColor();}private void setColor() {System.out.println("设置颜色");}private void resetColor() {System.out.println("重置颜色");}
}

最后,我们在主函数中测试这个桥接模式:

private void test() {Shape circle = new Circle();Shape square = new Square();Shape coloredCircle = new Color(circle);Shape coloredSquare = new Color(square);coloredCircle.draw();coloredSquare.draw();
}

2.4 有哪些注意点

使用桥接模式时需要注意以下几点:更多内容

  • 1、抽象部分和实现部分应该分离,不应该有过多的耦合。
  • 2、桥接模式适用于多个维度的变化,如果只有一两个维度的变化,使用继承会更加简单。
  • 3、桥接模式会增加系统的复杂度,需要谨慎使用。
  • 4、桥接模式要求正确选择和使用抽象类和接口,避免过度抽象或过于具体化。
  • 5、桥接模式的实现需要考虑对象的创建和管理,需要合理设计对象之间的关系和依赖关系。

03.桥接实例演示

3.1 需求分析

以当下支付场景为例,看下不同支付模式中桥接模式的应用。

如微信和支付宝都可以完成支付操作,而支付操作又可以有扫码支付、密码支付、人脸支付等,那么关于支付操作其实就有两个维度,包括:支付渠道和支付方式。

3.2 代码案例实现

不使用设计模式来模拟实现不同模式的支付场景。不使用设计模式缺点:维护和扩展都会变得非常复杂,需要修改原来代码,风险较大。更多内容

public class PayController {/*** @param uId         用户id* @param tradeId     交易流水号* @param amount      交易金额* @param channelType 渠道类型 1 微信, 2 支付宝* @param modeType    支付模式 1 密码,2 人脸,3 指纹* @return: boolean*/public void doPay(String uId, String tradeId, BigDecimal amount, int channelType, int modeType) {//微信支付if (1 == channelType) {System.out.println("微信渠道支付划账开始......");if (1 == modeType) {System.out.println("密码支付");} else if (2 == modeType) {System.out.println("人脸支付");} else if (3 == modeType) {System.out.println("指纹支付");}}//支付宝支付if (2 == channelType) {System.out.println("支付宝渠道支付划账开始......");if (1 == modeType) {System.out.println("密码支付");} else if (2 == modeType) {System.out.println("人脸支付");} else if (3 == modeType) {System.out.println("指纹支付");}}}
}

使用一下,如下所示:

private void test1() {PayController payController = new PayController();System.out.println("测试: 微信支付、人脸支付方式");payController.doPay("weixin", "1000112333333", new BigDecimal(100), 1, 2);System.out.println("\n测试: 支付宝支付、指纹支付方式");payController.doPay("zhifubao", "1000112334567", new BigDecimal(100), 2, 3);
}

3.3 是否可以优化

虽然不使用设计模式也能实现该支付场景需求,但以后若增加支付渠道或修改支付方式,比如增加了京东支付,抖音支付,或者增加一个微信刷掌支付,则成本比较高,不利于后边的扩展和维护。

使用桥接模式重构支付场景代码。

桥接模式原理的核心是: 首先有要识别出一个类所具有的的两个独立变化维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。更多内容

针对该支付场景上边已经抽出了2个维度,即:支付渠道 和 支付方式;这里我们可以把支付渠道作为抽象化角色,支付方式作为实现化角色,支付渠道*支付模式 = 相对应的支付组合;

3.4 桥接设计

1)Pay抽象类(支付渠道)

  1. I)支付渠道子类: 微信支付
  2. II)支付渠道子类: 支付宝支付

2)IPayMode接口(支付方式)

  1. I)支付模式实现: 刷脸支付
  2. II)支付模式实现: 指纹支付
  3. III)密码支付

3.5 演变代码案例

Implementor:实现类接口。定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。更多内容,这个定义支付方式接口!

/*** 支付模式接口*/
public interface IPayMode {//安全校验功能: 对各种支付模式进行风控校验boolean security(String uId);
}

ConcreteImplementor:具体实现类。给出实现化角色接口的具体实现。这里有密码支付,刷脸支付,指纹支付等。

/*** 密码支付及风控校验* 具体实现化(Concrete Implementor)角色*/
public class PayCypher implements IPayMode {@Overridepublic boolean security(String uId) {return false;}
}/*** 刷脸支付及风控校验* 具体实现化(Concrete Implementor)角色*/
public class PayFaceMode implements IPayMode {@Overridepublic boolean security(String uId) {return true;}
}/*** 指纹支付及风控校验* 具体实现化(Concrete Implementor)角色*/
public class PayFingerprintMode implements IPayMode {@Overridepublic boolean security(String uId) {return false;}
}

Abstraction:抽象类。主要负责定义出该角色的行为,并包含一个对实现化对象的引用。这里针对渠道抽象出角色。更多内容

/*** 支付抽象化类* 抽象化(Abstraction)角色*/
public abstract class Pay {protected IPayMode payMode;public Pay(IPayMode payMode){this.payMode = payMode;}//划账功能public abstract String transfer(String uId, String tradeId, BigDecimal amount);}

RefinedAbstraction:扩充抽象类。是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

/*** 支付渠道-微信* 扩展抽象化(RefinedAbstraction)角色*/
public class WxPay extends Pay{public WxPay(IPayMode payMode) {super(payMode);}@Overridepublic String transfer(String uId, String tradeId, BigDecimal amount) {System.out.println("微信渠道支付划账开始......");//支付方式校验boolean security = payMode.security(uId);System.out.println("微信渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);if(!security){System.out.println("微信渠道支付划账失败!");return "500";}System.out.println("微信渠道划账成功! 金额: "+ amount);return "200";}
}/*** 支付渠道--支付宝* 扩展抽象化(RefinedAbstraction)角色*/
public class ZfbPay extends Pay{public ZfbPay(IPayMode payMode) {super(payMode);}@Overridepublic String transfer(String uId, String tradeId, BigDecimal amount) {System.out.println("支付宝渠道支付划账开始......");//支付方式校验boolean security = payMode.security(uId);System.out.println("支付宝渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);if(!security){System.out.println("支付宝渠道支付划账失败!");return "500";}System.out.println("支付宝渠道划账成功! 金额: "+ amount);return "200";}
}

最后测试一下桥接模式,如下

private void test1() {System.out.println("测试场景1: 微信支付、人脸方式.");Pay wxpay = new WxPay(new PayFaceMode());wxpay.transfer("weixin","10001900",new BigDecimal(100));System.out.println();System.out.println("测试场景2: 支付宝支付、指纹方式");Pay zfbPay = new ZfbPay(new PayFingerprintMode());zfbPay.transfer("zhifubao","567689999999",new BigDecimal(200));
}

04.桥接实现方式

4.1 继承和组合

使用继承和组合的方式实现桥接模式。更多内容

这种方式需要创建两个类,一个作为抽象类,另一个作为具体类。抽象类中定义了对抽象部分和实现部分的引用,具体类中实现了抽象部分的具体逻辑。

// 抽象部分
abstract class Abstraction {protected Implementation implementation;public void setImplementation(Implementation implementation) {this.implementation = implementation;}public abstract void operation();
}// 具体部分
class ConcreteAbstraction extends Abstraction {@Overridepublic void operation() {System.out.println("具体操作");}
}// 实现部分
interface Implementation {void operationImpl();
}class ConcreteImplementationA implements Implementation {@Overridepublic void operationImpl() {System.out.println("实现A的操作");}
}class ConcreteImplementationB implements Implementation {@Overridepublic void operationImpl() {System.out.println("实现B的操作");}
}// 客户端代码
private void test() {Abstraction abstraction = new ConcreteAbstraction();Implementation implementationA = new ConcreteImplementationA();Implementation implementationB = new ConcreteImplementationB();abstraction.setImplementation(implementationA);abstraction.operation(); // 输出:具体操作abstraction.setImplementation(implementationB);abstraction.operation(); // 输出:具体操作
}

4.2 接口和内部类

使用接口和内部类的方式实现桥接模式

这种方式需要创建一个接口,一个抽象类和一个内部类。抽象类中定义了对接口的引用,内部类中实现了抽象类的具体逻辑。

// 接口
interface Shape {void draw();
}// 抽象部分
abstract class AbstractShape {protected Shape shape;public void setShape(Shape shape) {this.shape = shape;}public abstract void draw();
}// 具体部分
class Rectangle extends AbstractShape {@Overridepublic void draw() {shape.draw();}
}class Circle extends AbstractShape {@Overridepublic void draw() {shape.draw();}
}// 内部类实现接口
class ShapeImpl implements Shape {@Overridepublic void draw() {System.out.println("绘制形状");}
}// 客户端代码
private void test() {AbstractShape abstractShape = new Rectangle();Shape shapeA = new ShapeImpl();Shape shapeB = new ShapeImpl();abstractShape.setShape(shapeA);abstractShape.draw(); // 输出:绘制形状abstractShape.setShape(shapeB);abstractShape.draw(); // 输出:绘制形状
}

05.桥接模式分析

5.1 桥接模式优点

桥接模式的优点:

  1. 分离抽象接口及其实现部分。
  2. 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  3. 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  4. 实现细节对客户透明,可以对用户隐藏实现细节。

5.2 桥接模式缺点

桥接模式的缺点:

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进。更多内容

5.3 适用环境

在以下情况下可以使用桥接模式:

  1. 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  2. 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  3. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  4. 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
  5. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

5.4 模式拓展

适配器模式与桥接模式的联用:更多内容

桥接模式和适配器模式用于设计的不同阶段,桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式。但有时候在设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况。

06.外观代理总结

6.1 总结一下学习

01.桥接模式基础

桥接模式的由来是为了解决软件系统中的复杂性和耦合性问题。在大型软件系统中,各个子系统之间可能存在复杂的依赖关系和交互逻辑,这导致了系统的可维护性和可扩展性变得困难。为了简化客户端与子系统之间的交互,桥接模式被引入。

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

主要解决的问题:桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展。

02.桥接模式实现

假设有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和方形Square。对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。

桥接模式实现如下所示:

  1. 创建一个抽象类 Shape,它有一个抽象方法 draw()。
  2. 抽象化角色的子类,创建两个实现了 Shape 接口的具体类:Circle 和 Square。
  3. 创建一个桥接类 Color,它也实现了 Shape 接口,并持有一个 Shape 类型的引用。
  4. 在主函数中测试这个桥接模式。

03.桥接实例演示

如微信和支付宝都可以完成支付操作,而支付操作又可以有扫码支付、密码支付、人脸支付等,那么关于支付操作其实就有两个维度,包括:支付渠道和支付方式。

不使用设计模式来模拟实现不同模式的支付场景。不使用设计模式缺点:维护和扩展都会变得非常复杂,需要修改原来代码,风险较大。

以后若增加支付渠道或修改支付方式,比如增加了京东支付,抖音支付,或者增加一个微信刷掌支付,则成本比较高,不利于后边的扩展和维护。

桥接模式原理的核心是: 首先有要识别出一个类所具有的的两个独立变化维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。

6.2 更多内容推荐

模块描述备注
GitHub多个YC系列开源项目,包含Android组件库,以及多个案例GitHub
博客汇总汇聚Java,Android,C/C++,网络协议,算法,编程总结等YCBlogs
设计模式六大设计原则,23种设计模式,设计模式案例,面向对象思想设计模式
Java进阶数据设计和原理,面向对象核心思想,IO,异常,线程和并发,JVMJava高级
网络协议网络实际案例,网络原理和分层,Https,网络请求,故障排查网络协议
计算机原理计算机组成结构,框架,存储器,CPU设计,内存设计,指令编程原理,异常处理机制,IO操作和原理计算机基础
学习C编程C语言入门级别系统全面的学习教程,学习三到四个综合案例C编程
C++编程C++语言入门级别系统全面的教学教程,并发编程,核心原理C++编程
算法实践专栏,数组,链表,栈,队列,树,哈希,递归,查找,排序等Leetcode
Android基础入门,开源库解读,性能优化,Framework,方案设计Android

23种设计模式

23种设计模式 & 描述 & 核心作用包括
创建型模式
提供创建对象用例。能够将软件模块中对象的创建和对象的使用分离
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
结构型模式
关注类和对象的组合。描述如何将类或者对象结合在一起形成更大的结构
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式
特别关注对象之间的通信。主要解决的就是“类或对象之间的交互”问题
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)

6.3 更多内容

  • GitHub:https://github.com/yangchong211
  • 我的编程网站:https://yccoding.com
  • 博客汇总:https://github.com/yangchong211/YCBlogs
  • 设计模式专栏:https://github.com/yangchong211/YCDesignBlog
  • Java高级进阶专栏:https://github.com/yangchong211/YCJavaBlog
  • 网络协议专栏:https://github.com/yangchong211/YCNetwork
  • 计算机基础原理专栏:https://github.com/yangchong211/YCComputerBlog

相关文章:

10.桥接模式设计思想

10.桥接模式设计思想 目录介绍 01.桥接模式基础 1.1 桥接模式由来1.2 桥接模式定义1.3 桥接模式场景1.4 桥接模式思考1.5 解决的问题 02.桥接模式实现 2.1 罗列一个场景2.2 桥接结构2.3 桥接基本实现2.4 有哪些注意点 03.桥接实例演示 3.1 需求分析3.2 代码案例实现3.3 是否可…...

Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized

这里是Themberfue 在上一节的最后,我们讨论两个线程同时对一个变量累加所产生的现象 在这一节中,我们将更加详细地解释这个现象背后发生的原因以及该如何解决这样类似的现象 线程安全问题 public class Demo15 {private static int count 0;public …...

(已解决)Dependency “ ” not found 细谈

剖析原因:依赖在pom文件中引用后,然后ReLoad,此依赖会在你配置的本地仓库里面找,并下载下来,他报not found就是没有找到。 本地仓库的位置: 进一步深究:在本地仓库找的时候,他又会…...

网络编程、UDP、TCP、三次握手、四次挥手

一、初识网络编程 网络编程的概念:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件等等。 不管是什么场景,都是计算机和计算机之间通过网络进行…...

程序员的生活周刊 #7:耐克总裁被裁记

0. 庙宇 这张图来自 Tianshu Liu, 被树木环绕的宝塔庙宇 1. 耐克总裁 耐克最近的总裁 John Donahoe 干了 5 年,终于被裁掉了。 这位总裁即不了解球鞋文化,也没有零售经验,但不懂事的董事会还是聘用它,寄托把耐克从运…...

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

- UDF:一对一的函数【User Defined Functions】 - substr、split、concat、instr、length、from_unixtime - UDAF:多对一的函数【User Defined Aggregation Functions】 聚合函数 - count、sum、max、min、avg、collect_set/list - UDTF:…...

【Ubuntu20】VSCode Python代码规范工具配置 Pylint + Black + MyPy + isort

​ 常用工具: 在 Ubuntu20 下,有以下常见的 Python 代码工具: 静态分析工具: Pylint 和 Flake8 功能范围:Pylint功能非常强大,能够检查代码质量、潜在错误、代码风格、复杂度等多个方面, 并生成详细的报…...

游戏提示错误:xinput1_3.dll缺失?四种修复错误的xinput1_3.dll文件

在计算机的运行过程中,我们可能会遇到各种各样的问题,其中与“xinput1_3.dll”相关的问题也并不罕见。“xinput1_3.dll”是一个在许多游戏和多媒体应用程序运行过程中可能会用到的动态链接库文件。当我们启动某些游戏时,可能会突然弹出一个错…...

YOLOv11融合IncepitonNeXt[CVPR2024]及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 一、 模块介绍 论文链接:https://arxiv.org/abs/2303.16900 代码链接:https://github.com/sail-sg/inceptionnext 论文速览:受 ViT 长距离建模能力的启发,大核卷积…...

[Web安全 网络安全]-学习文章汇总导航(持续更新中)

文章目录: 一:学习路线资源 1.路线 2.资源 二:工具 三:学习笔记 1.基础阶段 2.进阶阶段 四:好的参考 五:靶场 博主对网络安全很感兴趣,但是不知道如何取学习,自己一步一步…...

Docker Compose部署Rabbitmq(Docker file安装延迟队列)

整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch:8.1.0 2、FileBeat:8.1.0 3、Kibana:8.1.0 4、logstach:8.1.0 本次统一版本:8.1.0,4个组件,划分目录,保持版本一致。 说明:elasticsearch和kib…...

本地模型导入ollama

文章目录 Modelfile模板导入到 ollama Modelfile模板 在本地模型目录下创建 Modelfile FROM ./qwen2.5-7b-instruct-q4_k_m.gguf# 设定温度参数为1 [更高的更具有创新性,更低的更富有连贯性] PARAMETER temperature 1 # 将上下文窗口大小设置为4096,这…...

scala Map训练

Map实训内容: 1.创建一个可变Map,用于存储图书馆中的书籍信息(键为书籍编号,值为包含书籍名称、作者、库存数量的元组),初始化为包含几本你喜欢的书籍信息。 2.使用 操作符添加两本新的书籍到图书馆集合中。 3.根据书籍编号查询某一本特定的书籍信息&…...

WorkFlow源码剖析——Communicator之TCPServer(下)

WorkFlow源码剖析——Communicator之TCPServer(下) 前言 系列链接如下: WorkFlow源码剖析——GO-Task 源码分析 WorkFlow源码剖析——Communicator之TCPServer(上) WorkFlow源码剖析——Communicator之TCPServer&…...

数据结构与算法分析:专题内容——动态规划2之例题讲解(代码详解+万字长文+算法导论+力扣题)

一、最长公共子序列 在生物应用中,经常需要比较两个(或多个)不同生物体的 DNA。一个 DNA 串由一串称为碱基(base)的分子组成,碱基有腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶 4 种类型。我们用英文单词首字母表示 4 种碱基,这样就可以将一个 DNA 串…...

【Qt】QTreeView 和 QStandardItemModel的关系

QTreeView 和 QAbstractItemModel(通常是其子类,如 QStandardItemModel 或自定义模型)是 Qt 框架中的两个关键组件,它们之间存在密切的关系。 关系概述 QTreeView: QTreeView 是一个用于显示和编辑层次数据的视图小部…...

containerd配置私有仓库registry

机器ip端口regtisry192.168.0.725000k8s-*-------k8s集群 1、镜像上传 rootadmin:~# docker push 192.168.0.72:5000/nginx:1.26.1-alpine The push refers to repository [192.168.0.72:5000/nginx] 6961f0b8531c: Pushed 3112cd521249: Pushed d3f50ce9b5b5: Pushed 9efaf2eb…...

深入解析语音识别中的关键技术:GMM、HMM、DNN和语言模型

目录 一、高斯混合模型(GMM)与期望最大化(EM)算法二、隐马尔可夫模型(HMM)三、深度神经网络(DNN)四、语言模型(LM)五、ASR系统的整体工作流程结论 在现代语音…...

C++循环引用

C循环引用‌指的是两个或多个类之间互相引用对方,形成一个循环的引用关系。 循环引用的问题: 编译错误‌:编译器在编译过程中会按照包含关系依次编译每个文件,当编译ClassA时,它会尝试包含ClassB.h文件,而…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...