4.桥接模式

概况

桥接模式:将抽象部分与实现部分分离,使它们可以独立变化,通过组合而非继承的方式实现解耦。


业务场景

场景描述:开发一个跨平台的图形绘制系统,支持不同形状(如圆形、矩形)和不同渲染方式(如矢量渲染、栅格渲染)。

  • 抽象部分:形状(如圆形、矩形)。

  • 实现部分:渲染方式(如矢量渲染、栅格渲染)。

代码示例

复制代码
// 实现部分接口
interface Renderer {
    void renderShape(String shape);
}

// 具体实现:矢量渲染
class VectorRenderer implements Renderer {
    @Override
    public void renderShape(String shape) {
        System.out.println("绘制 " + shape + " 使用矢量渲染");
    }
}

// 具体实现:栅格渲染
class RasterRenderer implements Renderer {
    @Override
    public void renderShape(String shape) {
        System.out.println("绘制 " + shape + " 使用栅格渲染");
    }
}

// 抽象部分:形状
abstract class Shape {
    protected Renderer renderer;

    public Shape(Renderer renderer) {
        this.renderer = renderer;
    }

    public abstract void draw();
}

// 具体抽象:圆形
class Circle extends Shape {
    public Circle(Renderer renderer) {
        super(renderer);
    }

    @Override
    public void draw() {
        renderer.renderShape("圆形");
    }
}

// 具体抽象:矩形
class Rectangle extends Shape {
    public Rectangle(Renderer renderer) {
        super(renderer);
    }

    @Override
    public void draw() {
        renderer.renderShape("矩形");
    }
}

// 客户端代码
public class BridgePatternDemo {
    public static void main(String[] args) {
        Renderer vectorRenderer = new VectorRenderer();
        Renderer rasterRenderer = new RasterRenderer();

        Shape circle = new Circle(vectorRenderer);
        circle.draw(); // 绘制 圆形 使用矢量渲染

        Shape rectangle = new Rectangle(rasterRenderer);
        rectangle.draw(); // 绘制 矩形 使用栅格渲染
    }
}

总结

  1. 核心思想:通过组合将抽象部分(如形状)与实现部分(如渲染方式)分离,使它们可以独立变化。

  2. 优点

    • 解耦抽象和实现,增强系统扩展性。

    • 符合开闭原则,新增抽象或实现时无需修改现有代码。

  3. 适用场景

    • 需要多维度扩展的系统(如多平台、多渲染方式)。

    • 避免类爆炸问题(如形状和渲染方式的组合)。

  4. 业务场景

    • 跨平台 UI 开发(如不同操作系统下的按钮和窗口)。

    • 数据库驱动设计(如不同数据库类型的连接和操作)。

    • 消息通知系统(如不同消息类型和发送渠道的组合)。

相关推荐
SeaTunnel2 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记2 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
CCPC不拿奖不改名2 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
Marst Code3 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook3 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
Miao121313 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城4 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience5 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao5 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具