设计模式-桥接模式

打印 上一主题 下一主题

主题 964|帖子 964|积分 2892

桥接模式是一种布局型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立变化。它通过组合代替继承的方式,解决多维度变化导致的类爆炸问题,同时进步体系的机动性和可扩展性。
焦点思想

桥接模式的焦点是将抽象(功能)和实现(平台/具体行为)解耦,使其可以独立扩展。例如:


  • 抽象部分:如“图形”的抽象(圆形、矩形)。
  • 实现部分:如“颜色”的实现(红色、蓝色)。
  • 桥接:通过将“颜色”的实现注入“图形”的抽象中,避免为每种图形和颜色的组合创建子类(如RedCircle、BlueRectangle)。
桥接模式的布局

桥接模式包罗以下角色:


  • 抽象类(Abstraction)
    定义抽象功能的接口,并持有实现部分的引用。例如:Shape抽象类,包罗draw()方法。
  • 扩展抽象类(Refined Abstraction)
    对抽象类的扩展,实现具体的功能。例如:Circle和Rectangle类,继承自Shape。
  • 实现接口(Implementor)
    定义实现部分的接口,供抽象类调用。例如:Color接口,定义颜色填充方法。
  • 具体实现类(Concrete Implementor)
    实现实现接口的具体逻辑。例如:Red和Blue类,实现Color接口。
桥接模式实现示例

假设需要绘制不同外形(圆形、矩形)和不同颜色(红色、蓝色)的图形,使用桥接模式避免创建 RedCircle、BlueCircle 等子类。
(1)实现接口(Implementor):颜色
  1. // 颜色接口(实现部分)
  2. public interface Color {
  3.     void applyColor();
  4. }
  5. // 具体颜色实现
  6. public class Red implements Color {
  7.     @Override
  8.     public void applyColor() {
  9.         System.out.print("红色");
  10.     }
  11. }
  12. public class Blue implements Color {
  13.     @Override
  14.     public void applyColor() {
  15.         System.out.print("蓝色");
  16.     }
  17. }
复制代码
(2)抽象类(Abstraction):图形
  1. // 图形抽象类(抽象部分)
  2. public abstract class Shape {
  3.     protected Color color; // 持有颜色的引用(桥接的关键)
  4.     public Shape(Color color) {
  5.         this.color = color;
  6.     }
  7.     public abstract void draw();
  8. }
  9. // 具体图形实现
  10. public class Circle extends Shape {
  11.     public Circle(Color color) {
  12.         super(color);
  13.     }
  14.     @Override
  15.     public void draw() {
  16.         System.out.print("圆形:");
  17.         color.applyColor(); // 委托给颜色实现
  18.         System.out.println();
  19.     }
  20. }
  21. public class Rectangle extends Shape {
  22.     public Rectangle(Color color) {
  23.         super(color);
  24.     }
  25.     @Override
  26.     public void draw() {
  27.         System.out.print("矩形:");
  28.         color.applyColor();
  29.         System.out.println();
  30.     }
  31. }
复制代码
(3)客户端代码
  1. public class Client {
  2.     public static void main(String[] args) {
  3.         // 创建颜色实现
  4.         Color red = new Red();
  5.         Color blue = new Blue();
  6.         // 创建图形,并桥接颜色
  7.         Shape redCircle = new Circle(red);
  8.         Shape blueRectangle = new Rectangle(blue);
  9.         // 绘制图形
  10.         redCircle.draw();    // 输出:圆形:红色
  11.         blueRectangle.draw(); // 输出:矩形:蓝色
  12.     }
  13. }
复制代码
桥接模式的优点



  • 解耦抽象与实现
    抽象和实现可以独立扩展,互不影响。例如,新增颜色或外形无需修改对方。
  • 避免类爆炸
    无需为每个组合(如 RedCircle、BlueRectangle)创建子类。
  • 进步机动性
    可以在运行时动态切换实现(例如切换颜色)。
  • 符合开闭原则
    新增功能只需扩展抽象或实现类,无需修改现有代码。
桥接模式的缺点



  • 增加体系复杂性
    需要正确识别抽象和实现的边界,设计不妥可能导致布局冗余。
  • 理解成本较高
    对初学者来说,桥接模式的设计思想可能较难掌握。
桥接模式的现实应用



  • JDBC驱动程序
    抽象:JDBC接口(如Connection、Statement)。
    实现:不同数据库的驱动(如MySQL、Oracle)。
    桥接:通过DriverManager将抽象接口与具体驱动桥接。
  • 图形界面框架
    抽象:窗口、按钮等控件的逻辑。
    实现:不同利用体系的绘制API(如Windows API、macOS API)。
    桥接:控件通过桥接调用具体体系的API实现渲染。
  • 日志框架
    抽象:日志记录接口(如Logger)。
    实现:日志输出的具体方式(文件、控制台、网络)。
    桥接:通过桥接模式动态切换日志输出目标。
应用场景:

  • 多维度变化的体系
    例如:图形和颜色、利用体系(Windows、Linux)和文件格式(PNG、JPEG)等
  • 避免多层继承布局
    当继承导致类数量指数级增长时,使用桥接模式替换。
  • 运行时切换实现
    需要动态切换不同实现(如切换数据库驱动)。
桥接模式与其他模式的区别

模式焦点思想应用场景桥接模式分离抽象和实现,通过组合代替继承多维度变化的体系,避免类爆炸适配器模式转换接口以实现兼容整合不兼容的接口战略模式封装算法,使其可互换动态选择算法(如排序战略)抽象工厂模式创建相干对象的家族需要统一风格的组件(如UI控件) 总结

通过桥接模式,可以优雅地处理多维度变化,避免类层次布局的过度膨胀。它是设计复杂体系时的重要工具,尤其得当需要长期维护和扩展的代码。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表