1. 设计模式之桥接模式:两个代码组件之间面向接口桥接调用
1.1. 介绍
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。
桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。
桥接模式,几乎不需要特意去运用,java之中,无处不桥接,几乎所有的编程,都是面向接口去编程的。
应用场景
跨平台开发:如UI组件与不同渲染引擎(OpenGL/Vulkan/Metal)解耦。
数据库驱动切换:JDBC驱动通过桥接模式连接不同数据库(MySQL/Oracle)。
设备控制:遥控器抽象与具体设备(电视/音响)独立扩展。
消息通知系统:消息类型(短信/邮件)与发送渠道(腾讯云/阿里云)解耦。
优缺点及建议
优点
1.抽象与实现分离:提高了系统的灵活性和可维护性。
2.扩展能力强:可以独立地扩展抽象和实现。
3.实现细节透明:用户不需要了解实现细节。
缺点
1.理解与设计难度:桥接模式增加了系统的理解与设计难度。
2.聚合关联:要求开发者在抽象层进行设计与编程。
使用建议
1.当系统需要在抽象化角色和具体化角色之间增加灵活性时,考虑使用桥接模式。
2.对于不希望使用继承或因多层次继承导致类数量急剧增加的系统,桥接模式特别适用。
3.当一个类存在两个独立变化的维度,且这两个维度都需要扩展时,使用桥接模式。
注意事项
1.桥接模式适用于两个独立变化的维度,确保它们可以独立地扩展和变化。
1.2. 实现及相关代码
假设有一个业务,需要调用另一个不相关的业务组件。(通过桥接方式,通过接口作为桥梁去调用)
1.2.1. 相关代码
接口及数据对象
public interface Implementor {
void execute();
}
public static class ConcreteImplementor implements Implementor {
public void execute() {
System.out.println("执行了功能逻辑");
}
}
public static abstract class Abstraction {
protected Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public abstract void execute();
}
public static class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
@Override
public void execute() {
implementor.execute();
}
}
调用方法
public static void main(String[] args) {
Implementor implementor = new ConcreteImplementor();
// 传入组件
Abstraction abstraction = new RefinedAbstraction(implementor);
// 通过接口建立桥梁,调用接口来调用对应的组件
abstraction.execute();
}