高端定制网站,免费申请httq,,网站?,单位网站建设费用账务处理,传媒公司vi桥接模式#xff08;Bridge Pattern#xff09;学习笔记
#x1f31f; 定义
桥接模式属于结构型设计模式#xff0c;将抽象部分与实现部分分离#xff0c;使它们可以独立变化。通过组合代替继承的方式#xff0c;解决多维度的扩展问题#xff0c;防止类爆炸。 #x…桥接模式Bridge Pattern学习笔记 定义
桥接模式属于结构型设计模式将抽象部分与实现部分分离使它们可以独立变化。通过组合代替继承的方式解决多维度的扩展问题防止类爆炸。 适用场景
需要避免抽象与实现之间的永久绑定多个维度变化的系统如形状×颜色×材质需要在运行时切换实现存在多个独立扩展的维度需要共享实现多个对象共享相同实现 模式结构 类图 #mermaid-svg-n6M9XVTHLyLQD9Ma {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-n6M9XVTHLyLQD9Ma .error-icon{fill:#552222;}#mermaid-svg-n6M9XVTHLyLQD9Ma .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n6M9XVTHLyLQD9Ma .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n6M9XVTHLyLQD9Ma .marker.cross{stroke:#333333;}#mermaid-svg-n6M9XVTHLyLQD9Ma svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n6M9XVTHLyLQD9Ma g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-n6M9XVTHLyLQD9Ma g.classGroup text .title{font-weight:bolder;}#mermaid-svg-n6M9XVTHLyLQD9Ma .nodeLabel,#mermaid-svg-n6M9XVTHLyLQD9Ma .edgeLabel{color:#131300;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-n6M9XVTHLyLQD9Ma .label text{fill:#131300;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-n6M9XVTHLyLQD9Ma .classTitle{font-weight:bolder;}#mermaid-svg-n6M9XVTHLyLQD9Ma .node rect,#mermaid-svg-n6M9XVTHLyLQD9Ma .node circle,#mermaid-svg-n6M9XVTHLyLQD9Ma .node ellipse,#mermaid-svg-n6M9XVTHLyLQD9Ma .node polygon,#mermaid-svg-n6M9XVTHLyLQD9Ma .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-n6M9XVTHLyLQD9Ma .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma g.clickable{cursor:pointer;}#mermaid-svg-n6M9XVTHLyLQD9Ma g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-n6M9XVTHLyLQD9Ma g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-n6M9XVTHLyLQD9Ma .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-n6M9XVTHLyLQD9Ma .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-n6M9XVTHLyLQD9Ma .dashed-line{stroke-dasharray:3;}#mermaid-svg-n6M9XVTHLyLQD9Ma #compositionStart,#mermaid-svg-n6M9XVTHLyLQD9Ma .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #compositionEnd,#mermaid-svg-n6M9XVTHLyLQD9Ma .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #dependencyStart,#mermaid-svg-n6M9XVTHLyLQD9Ma .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #dependencyStart,#mermaid-svg-n6M9XVTHLyLQD9Ma .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #extensionStart,#mermaid-svg-n6M9XVTHLyLQD9Ma .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #extensionEnd,#mermaid-svg-n6M9XVTHLyLQD9Ma .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #aggregationStart,#mermaid-svg-n6M9XVTHLyLQD9Ma .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma #aggregationEnd,#mermaid-svg-n6M9XVTHLyLQD9Ma .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n6M9XVTHLyLQD9Ma .edgeTerminals{font-size:11px;}#mermaid-svg-n6M9XVTHLyLQD9Ma :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} «abstract» Abstraction -implementor: Implementor operation() RefinedAbstraction operation() «interface» Implementor operationImpl() ConcreteImplementorA operationImpl() ConcreteImplementorB operationImpl() ️ 核心组成 Abstraction抽象类 定义抽象接口维护实现者对象Implementor的引用 RefinedAbstraction扩展抽象类 对抽象接口的扩展/细化 Implementor实现者接口 定义实现类的接口 ConcreteImplementor具体实现类 实现Implementor接口的具体类 代码示例
图形渲染场景
// 实现者接口颜色渲染
interface Color {String fill();
}// 具体实现类
class Red implements Color {Overridepublic String fill() {return 红色;}
}class Blue implements Color {Overridepublic String fill() {return 蓝色;}
}// 抽象类形状
abstract class Shape {protected Color color;public Shape(Color color) {this.color color;}abstract String draw();
}// 扩展抽象类
class Circle extends Shape {public Circle(Color color) {super(color);}Overridepublic String draw() {return 圆形 ➤ 填充颜色 color.fill();}
}class Square extends Shape {public Square(Color color) {super(color);}Overridepublic String draw() {return 方形 ■ 填充颜色 color.fill();}
}// 客户端使用
public class Client {public static void main(String[] args) {Color red new Red();Color blue new Blue();Shape redCircle new Circle(red);Shape blueSquare new Square(blue);System.out.println(redCircle.draw()); // 圆形 ➤ 填充颜色红色System.out.println(blueSquare.draw()); // 方形 ■ 填充颜色蓝色}
}✅ 优点
解耦抽象与实现提高扩展性避免多层继承导致的类爆炸符合开闭原则可独立扩展抽象层和实现层符合单一职责原则抽象关注高层逻辑实现关注底层细节运行时切换实现动态绑定 ⚠️ 缺点
增加系统复杂度需要正确识别抽象和实现两个维度对高内聚的系统可能不适用需要更多的设计前期分析 相关模式对比
模式区别适配器模式事后补救 vs 事前设计抽象工厂可与桥接模式配合创建实现对象策略模式侧重算法替换 vs 结构分离 实践建议
识别变化维度至少有两个独立变化的维度优先组合使用组合代替继承接口设计保持Implementor接口足够精简桥接管理可使用工厂模式创建桥接对象多层桥接支持多级桥接如抽象→中间层→实现 典型应用 GUI开发 窗口系统不同OS的窗口实现控件渲染按钮×主题 驱动程序 JDBC驱动程序打印机驱动程序 跨平台应用 不同数据库的SQL生成器不同支付渠道的支付接口 实现要点 委托代替继承 // 传统继承方式类爆炸
class RedCircle extends Circle {}
class BlueCircle extends Circle {}
class RedSquare extends Square {}
// ...其他组合// 桥接模式方式
new Circle(new Red())动态切换实现 Shape shape new Circle(new Red());
shape.draw(); // 红色圆形shape.color new Blue(); // 切换颜色实现
shape.draw(); // 蓝色圆形JDBC中的桥接模式 // 抽象Connection接口
// 实现Driver实现类
Class.forName(com.mysql.jdbc.Driver);
Connection conn DriverManager.getConnection(url);扩展应用 多格式日志系统 日志级别DEBUG/INFO/ERROR× 输出格式文本/JSON/XML 跨平台文件操作 文件类型普通/加密× 存储系统本地/FTP/云存储 游戏角色系统 角色职业战士/法师× 装备套装轻甲/重甲 掌握桥接模式的关键在于理解多维变化的分离思想通过将抽象与实现解耦可以实现更灵活的系统架构特别适合需要应对多维度扩展的复杂系统设计。