什么是桥接模式?
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。这种模式通过组合的方式来替代继承,降低了类与类之间的耦合度。
为什么使用桥接模式?
- 避免类爆炸性增长
- 实现抽象和实现的分离
- 提高系统的可扩展性
- 实现细节对客户透明
实现示例
1. 基本实现
// 实现接口
public interface DrawAPI {
void drawCircle(int radius, int x, int y);
}
// 具体实现类A
public class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: red, radius: " + radius +
", x: " + x + ", y: " + y + "]");
}
}
// 具体实现类B
public class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: green, radius: " + radius +
", x: " + x + ", y: " + y + "]");
}
}
// 抽象类
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI) {
this.drawAPI = drawAPI;
}
public abstract void draw();
}
// 扩展抽象类
public class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
public void draw() {
drawAPI.drawCircle(radius, x, y);
}
}2. 实际应用示例:消息发送系统
// 消息接口
public interface MessageImplementor {
void send(String message, String toUser);
}
// 短信实现
public class SmsMessage implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用短信发送消息:" + message + " 到用户:" + toUser);
}
}
// 邮件实现
public class EmailMessage implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用邮件发送消息:" + message + " 到用户:" + toUser);
}
}
// 抽象消息类
public abstract class AbstractMessage {
protected MessageImplementor implementor;
public AbstractMessage(MessageImplementor implementor) {
this.implementor = implementor;
}
public abstract void sendMessage(String message, String toUser);
}
// 普通消息
public class CommonMessage extends AbstractMessage {
public CommonMessage(MessageImplementor implementor) {
super(implementor);
}
@Override
public void sendMessage(String message, String toUser) {
// 可以添加普通消息的处理逻辑
implementor.send(message, toUser);
}
}
// 紧急消息
public class UrgentMessage extends AbstractMessage {
public UrgentMessage(MessageImplementor implementor) {
super(implementor);
}
@Override
public void sendMessage(String message, String toUser) {
message = "【紧急】" + message;
implementor.send(message, toUser);
}
}3. JDBC中的桥接模式示例
// 数据库驱动接口
public interface Driver {
Connection connect(String url, Properties info);
}
// MySQL驱动实现
public class MySQLDriver implements Driver {
@Override
public Connection connect(String url, Properties info) {
// MySQL连接实现
return new MySQLConnection();
}
}
// Oracle驱动实现
public class OracleDriver implements Driver {
@Override
public Connection connect(String url, Properties info) {
// Oracle连接实现
return new OracleConnection();
}
}
// 抽象数据库操作类
public abstract class Database {
protected Driver driver;
public Database(Driver driver) {
this.driver = driver;
}
public abstract void executeQuery(String sql);
}
// 具体数据库操作类
public class BusinessDatabase extends Database {
public BusinessDatabase(Driver driver) {
super(driver);
}
@Override
public void executeQuery(String sql) {
Connection conn = driver.connect("jdbc:db://localhost:3306", new Properties());
// 执行查询
}
}4. 使用示例
public class Client {
public static void main(String[] args) {
// 绘图示例
Shape redCircle = new Circle(100, 100, 10, new RedCircle());
Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());
redCircle.draw();
greenCircle.draw();
// 消息发送示例
AbstractMessage commonSms = new CommonMessage(new SmsMessage());
commonSms.sendMessage("你好", "张三");
AbstractMessage urgentEmail = new UrgentMessage(new EmailMessage());
urgentEmail.sendMessage("系统异常", "管理员");
}
}桥接模式的优点
- 分离抽象接口及其实现部分
- 提高可扩充性
- 实现细节对客户透明
- 可以取代多层继承方案
桥接模式的缺点
- 增加了系统的理解与设计难度
- 需要正确识别出系统中的两个独立变化的维度
适用场景
- 需要在抽象化和实现化之间增加更多灵活性的场景
- 一个类存在多个独立变化的维度,且这些维度都需要进行扩展
- 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统
与其他模式的关系
- 适配器模式:适配器模式用于解决已有接口的兼容问题
- 策略模式:桥接模式着重于分离抽象和实现,而策略模式着重于算法的封装
- 抽象工厂模式:可以结合使用来创建和配置特定的桥接模式
总结
桥接模式是一种很实用的结构型设计模式,它主要用于处理多维度变化的系统,通过将抽象部分与实现部分分离,使得两者可以独立地变化。在实际开发中,当遇到需要处理多个维度变化的情况时,桥接模式是一个很好的选择。
参考资料
- 《Design Patterns: Elements of Reusable Object-Oriented Software》
- 《Head First Design Patterns》
- Java API 文档
- Spring Framework 源码

