「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想

  • 桥接模式(Bridge Pattern)是一种结构型设计模式,将抽象部分与其实现部分分离,使它们可以独立变化。降低代码耦合度,避免类爆炸,提高代码的可扩展性。

结构

1. Implementation(实现类接口)

  • 定义具体实现的行为接口。

2. ConcreteImplementations(具体实现类)

  • 具体的实现类,实现 Implementation 接口。

3. Abstraction(抽象类)

  • 定义高层逻辑,组合 Implementation(实现类接口)对象。

4. RefinedAbstraction(精确抽象类)

  • Abstraction 的子类,实现父类的业务方法,并通过组合关系调用实现化角色中的业务方法。

适用场景

  1. 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
    1. 桥接建议将每个维度抽取为独立的类层次。 初始类将相关工作委派给属于对应类层次的对象, 无需自己完成所有工作。
  1. 希望将实现细节对外隐藏。
  2. 如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式, 避免继承层次过于庞大,导致类爆炸**。**
    1. 桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。
  1. 如果你需要在运行时切换不同实现方法, 可使用桥接模式。
    1. 桥接模式可替换抽象部分中的实现对象, 具体操作就和给成员变量赋新值一样简单。

优缺点

优点:

  • 高扩展性:你可以创建与平台无关的类和程序。
  • 隐藏实现细节:客户端代码仅与高层抽象部分进行互动, 不会接触到平台的详细信息。
  • 遵循 开闭原则: 你可以新增抽象部分和实现部分, 且它们之间不会相互影响。
  • 符合 单一职责原则: 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

缺点:

  • 对高内聚的类使用该模式可能会让代码更加复杂。

实现步骤

  1. 明确类中独立的维度。 独立的概念可能是: 抽象/平台, 域/基础设施, 前端/后端或接口/实现。
  2. 了解客户端的业务需求, 并在抽象基类中定义它们。
  3. 确定在所有平台上都可执行的业务。 并在通用实现接口中声明抽象部分所需的业务。
  4. 为你域内的所有平台创建实现类, 但需确保它们遵循实现部分的接口。
  5. 在抽象类中添加指向实现类型的引用成员变量。 抽象部分会将大部分工作委派给该成员变量所指向的实现对象。
  6. 如果你的高层逻辑有多个变体, 则可通过扩展抽象基类为每个变体创建一个精确抽象。
  7. 客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。 此后, 客户端只需与抽象对象进行交互, 无需和实现对象打交道。

示例

// 实现类接口
public interface VideoFile {

    void decode(String fileName);
}

// 具体实现类------AVI格式
public class AVIFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("AVI格式文件" + fileName);
    }
}

// 具体实现类------RMVB格式
public class RMVBFile implements VideoFile{
    @Override
    public void decode(String fileName) {
        System.out.println("RMVB格式文件" + fileName);
    }
}

// 抽象类
public abstract class OperatingSystem {

    // 保证子类可以访问,而外部类不能访问,提高封装性
    // 不用private是因为避免子类使用时要用getter/setter
    protected VideoFile videoFile;

    public OperatingSystem(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    public abstract void play(String fileName);
}

// 扩展抽象类------Windows
public class Windows extends OperatingSystem{

    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}

// 扩展抽象类------Mac
public class Mac extends OperatingSystem{

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        VideoFile videoFile = new AVIFile();
        OperatingSystem operatingSystem = new Windows(videoFile);
        operatingSystem.play("test.avi");

        System.out.println("-----------------------------------------");

        videoFile = new RMVBFile();
        operatingSystem = new Mac(videoFile);
        operatingSystem.play("test.rmvb");
    }
}

与其他模式的关系

  • 桥接模式通常会于开发前期进行设计, 使你能够将程序的各个部分独立开来以便开发。 另一方面, 适配器模式通常在已有程序中使用, 让相互不兼容的类能很好地合作。
  • 桥接状态模式策略模式 (在某种程度上包括适配器) 模式的接口非常相似。 实际上, 它们都基于组合模式------即将工作委派给其他对象, 不过也各自解决了不同的问题。 模式并不只是以特定方式组织代码的配方, 你还可以使用它们来和其他开发者讨论模式所解决的问题。
  • 你可以将抽象工厂模式桥接搭配使用。 如果由 定义的抽象只能与特定实现合作, 这一模式搭配就非常有用。 在这种情况下, 可以对这些关系进行封装, 并且对客户端代码隐藏其复杂性。
  • 你可以结合使用生成器模式桥接模式主管 类负责抽象工作, 各种不同的生成器 负责实现工作。
相关推荐
凭君语未可20 分钟前
豆包MarsCode:小C的类二进制拼图
java·算法
Lsland..26 分钟前
Spring Boot 基础开发:实现 RESTful API 开发
spring boot·后端·restful
程序员勋勋11 小时前
【GoLang】利用validator包实现服务端参数校验时自定义错误信息
后端·golang·web
jimiStephen1 小时前
Go-并行编程新手指南
开发语言·后端·golang
字节全栈_mMD1 小时前
Flask框架基础入门教程_ezflaskapp
后端·python·flask
uhakadotcom1 小时前
YC 2025年春季的14条创业项目需求
后端·面试·架构
master-dragon2 小时前
Java锁自定义实现到aqs的理解
java·开发语言
hamster20212 小时前
力扣【1049. 最后一块石头的重量 II】Java题解(背包问题)
java·算法·leetcode
qwy7152292581633 小时前
3-scala的类
开发语言·后端·scala