以下是一个结合桥接模式解决实际开发问题的Java实现案例,涵盖多维度扩展、平台兼容性处理、渲染引擎解耦等场景需求,附带逐行中文注释:
场景描述
开发一个跨平台图形渲染框架,需支持:
图形类型扩展:圆形、矩形、三角形等
渲染引擎扩展:OpenGL、Vulkan、DirectX等
动态切换能力:运行时切换渲染引擎
避免类爆炸:N种图形×M种引擎≠N×M个类
完整代码实现
// ================== 实现部分:渲染引擎接口 ==================
/*** 渲染引擎接口(实现层核心抽象)*/
interface RenderEngine {// 绘制基础方法void drawCircle(float radius);void drawRectangle(float width, float height);void drawTriangle(float[] points);// 引擎初始化/清理void initialize();void cleanup();
}/*** OpenGL实现(具体实现)*/
class OpenGLEngine implements RenderEngine {@Overridepublic void initialize() {System.out.println("初始化OpenGL上下文...");}@Overridepublic void cleanup() {System.out.println("清理OpenGL资源...");}@Overridepublic void drawCircle(float radius) {System.out.printf("OpenGL绘制圆形,半径:%.1f\n", radius);}@Overridepublic void drawRectangle(float width, float height) {System.out.printf("OpenGL绘制矩形,宽:%.1f 高:%.1f\n", width, height);}@Overridepublic void drawTriangle(float[] points) {System.out.printf("OpenGL绘制三角形,顶点:%s\n", Arrays.toString(points));}
}/*** Vulkan实现(具体实现)*/
class VulkanEngine implements RenderEngine {@Overridepublic void initialize() {System.out.println("初始化Vulkan设备...");}@Overridepublic void cleanup() {System.out.println("清理Vulkan资源...");}@Overridepublic void drawCircle(float radius) {System.out.printf("Vulkan绘制圆形,半径:%.1f\n", radius);}@Overridepublic void drawRectangle(float width, float height) {System.out.printf("Vulkan绘制矩形,宽:%.1f 高:%.1f\n", width, height);}@Overridepublic void drawTriangle(float[] points) {System.out.printf("Vulkan绘制三角形,顶点:%s\n", Arrays.toString(points));}
}// ================== 抽象部分:图形对象 ==================
/*** 图形抽象类(抽象层核心)*/
abstract class Shape {protected RenderEngine engine; // 桥接关键:持有实现层引用protected Shape(RenderEngine engine) {this.engine = engine;}// 允许动态切换渲染引擎public void switchEngine(RenderEngine newEngine) {this.engine = newEngine;System.out.println("已切换渲染引擎");}// 抽象绘制方法public abstract void draw();
}/*** 圆形(扩展抽象)*/
class Circle extends Shape {private final float radius;private final float x, y;public Circle(RenderEngine engine, float x, float y, float radius) {super(engine);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {System.out.printf("开始绘制圆形(位置:%.1f,%.1f)→ ", x, y);engine.drawCircle(radius);}
}/*** 矩形(扩展抽象)*/
class Rectangle extends Shape {private final float width, height;private final float x, y;public Rectangle(RenderEngine engine, float x, float y, float width, float height) {super(engine);this.x = x;this.y = y;this.width = width;this.height = height;}@Overridepublic void draw() {System.out.printf("开始绘制矩形(位置:%.1f,%.1f)→ ", x, y);engine.drawRectangle(width, height);}
}// ================== 高级功能:带边框的图形 ==================
/*** 带边框的图形(扩展抽象的增强)*/
abstract class BorderedShape extends Shape {protected int borderWidth;protected String borderColor;public BorderedShape(RenderEngine engine, int borderWidth, String borderColor) {super(engine);this.borderWidth = borderWidth;this.borderColor = borderColor;}// 边框绘制方法(由具体子类实现)protected abstract void drawBorder();
}/*** 带边框的圆形*/
class BorderedCircle extends Circle {private final int borderWidth;private final String borderColor;public BorderedCircle(RenderEngine engine, float x, float y, float radius, int borderWidth, String borderColor) {super(engine, x, y, radius);this.borderWidth = borderWidth;this.borderColor = borderColor;}@Overridepublic void draw() {super.draw();drawBorder();}@Overrideprotected void drawBorder() {System.out.printf("绘制%dpx %s边框 → ", borderWidth, borderColor);engine.drawCircle(radius + borderWidth); // 模拟边框绘制逻辑}
}// ================== 客户端代码 ==================
public class BridgePatternDemo {public static void main(String[] args) {// 初始化渲染引擎RenderEngine opengl = new OpenGLEngine();RenderEngine vulkan = new VulkanEngine();opengl.initialize();vulkan.initialize();// 创建图形对象并绘制Shape circle = new Circle(opengl, 10, 10, 5);circle.draw();Shape rect = new Rectangle(vulkan, 20, 20, 8, 6);rect.draw();// 动态切换引擎circle.switchEngine(vulkan);circle.draw();// 使用带边框的高级图形BorderedCircle borderedCircle = new BorderedCircle(opengl, 30, 30, 7, 2, "红色");borderedCircle.draw();// 清理资源opengl.cleanup();vulkan.cleanup();}
}
模式对比
模式 | 关注点 | 桥接模式特点 |
---|---|---|
适配器模式 | 接口转换 | 结构后期补救,解决不兼容问题 |
桥接模式 | 架构设计 | 前期设计,分离抽象与实现 |
策略模式 | 算法替换 | 行为模式,侧重算法族的替换 |
抽象工厂模式 | 产品家族创建 | 与桥接模式常结合使用(创建具体引擎实例) |
通过这个案例可以看出,桥接模式在需要处理多维度变化和追求架构灵活性的场景中具有重要价值。在实际开发中 |
建议:
识别变化维度:明确哪些维度需要独立变化
优先使用组合:通过持有实现接口避免继承膨胀
定义清晰接口:保证抽象层与实现层解耦
结合其他模式:如工厂模式创建具体引擎实例
一句话总结
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。