桥接模式可以用开关和电气的关系来表示,开关属于抽象层,主要负责做开和关的操作,但是具体怎么开启和关闭是由电器决定的。电器属于实现层,比如风扇,灯泡,各自实现自己的开关逻辑。这样做的好处是开关和电器都可以独立升级,互不影响。当抽象和实现都可能变化时,桥接模式提供灵活扩展性!
案例代码:遥控器与设备
- 实现层接口(设备)
// 设备接口(实现层)
interface Device {
void turnOn();
void turnOff();
void setVolume(int volume);
}
// 电视实现
class TV implements Device {
public void turnOn() { System.out.println("TV打开"); }
public void turnOff() { System.out.println("TV关闭"); }
public void setVolume(int vol) { System.out.println("TV音量设置到 " + vol); }
}
// 收音机实现
class Radio implements Device {
public void turnOn() { System.out.println("Radio打开"); }
public void turnOff() { System.out.println("Radio关闭"); }
public void setVolume(int vol) { System.out.println("Radio音量设置到 " + vol); }
}
- 抽象层(遥控器)
// 抽象遥控器(抽象层)
abstract class RemoteControl {
protected Device device; // 组合实现层对象
public RemoteControl(Device device) {
this.device = device;
}
abstract void power(); // 抽象方法:开关操作
public void volumeUp() { device.setVolume(10); } // 默认调音量方法
}
// 基础遥控器
class BasicRemote extends RemoteControl {
public BasicRemote(Device device) { super(device); }
public void power() {
System.out.print("基础遥控器:");
device.turnOn();
}
}
// 高级遥控器(可静音)
class AdvancedRemote extends RemoteControl {
public AdvancedRemote(Device device) { super(device); }
public void power() {
System.out.print("高级遥控器:");
device.turnOn();
}
public void mute() { device.setVolume(0); } // 新增功能
}
- 使用桥接模式
public class BridgeDemo {
public static void main(String[] args) {
// 创建设备(实现层)
Device tv = new TV();
Device radio = new Radio();
// 创建遥控器(抽象层),组合不同设备
RemoteControl basicForTV = new BasicRemote(tv);
RemoteControl advancedForRadio = new AdvancedRemote(radio);
basicForTV.power(); // 输出:基础遥控器:TV打开
advancedForRadio.power(); // 输出:高级遥控器:Radio打开
((AdvancedRemote)advancedForRadio).mute(); // 静音
}
}
应用场景案例:图形与渲染引擎
场景描述
- 抽象层:图形(如圆形、矩形)
- 实现层:渲染引擎(如 OpenGL、Vulkan)
图形和渲染方式可以自由组合,新增图形或引擎无需修改对方代码。
代码实现
// 实现层:渲染引擎
interface RenderEngine {
void renderShape(String shape);
}
class OpenGL implements RenderEngine {
public void renderShape(String shape) {
System.out.println("OpenGL 渲染 " + shape);
}
}
class Vulkan implements RenderEngine {
public void renderShape(String shape) {
System.out.println("Vulkan 渲染 " + shape);
}
}
// 抽象层:图形
abstract class Shape {
protected RenderEngine renderer;
public Shape(RenderEngine renderer) {
this.renderer = renderer;
}
abstract void draw();
}
class Circle extends Shape {
public Circle(RenderEngine renderer) { super(renderer); }
public void draw() {
renderer.renderShape("圆形");
}
}
class Rectangle extends Shape {
public Rectangle(RenderEngine renderer) { super(renderer); }
public void draw() {
renderer.renderShape("矩形");
}
}
// 使用示例
public class GraphicsDemo {
public static void main(String[] args) {
RenderEngine opengl = new OpenGL();
RenderEngine vulkan = new Vulkan();
Shape circle = new Circle(opengl);
Shape rect = new Rectangle(vulkan);
circle.draw(); // 输出:OpenGL 渲染 圆形
rect.draw(); // 输出:Vulkan 渲染 矩形
}
}
桥接模式应用场景还包括
- 支付系统:支付方式(支付宝/微信)与支付渠道(国内/国际)解耦。
- 数据库连接:程序接口(JDBC)与具体数据库驱动(MySQL/Oracle)分离。