设计模式——桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过引入抽象层和实现层的组合来解耦,允许在运行时动态地改变或扩展对象的行为。

原理

  • 抽象部分(Abstraction): 定义抽象类,它包含一个对实现部分的引用,并定义了与实现相关的操作。
  • 扩展抽象部分(Refined Abstraction): 是抽象部分的子类,它们扩展了抽象部分的功能,但保留了对实现部分的引用。
  • 实现部分接口(Implementor): 定义实现部分的接口,接口中包含了实现部分必须实现的方法。
  • 具体实现部分(Concrete Implementor): 实现了实现部分接口的具体类,提供了各种实现细节。

Java代码示例

// 实现部分接口
public interface DrawingAPI {
   
    void drawCircle(double x, double y, double radius);
}

// 具体实现部分1:BasicDrawingAPI
public class BasicDrawingAPI implements DrawingAPI {
   
    @Override
    public void drawCircle(double x, double y, double radius) {
   
        System.out.println("Using BasicDrawingAPI to draw a circle at (" + x + ", " + y + ") with radius " + radius);
    }
}

// 具体实现部分2:AdvancedDrawingAPI
public class AdvancedDrawingAPI implements DrawingAPI {
   
    @Override
    public void drawCircle(double x, double y, double radius) {
   
        System.out.println("Using AdvancedDrawingAPI to draw a circle at (" + x + ", " + y + ") with radius " + radius);
    }
}

// 抽象部分
public abstract class Shape {
   
    protected DrawingAPI drawingAPI;

    public Shape(DrawingAPI drawingAPI) {
   
        this.drawingAPI = drawingAPI;
    }

    public abstract void draw();

    // 其他抽象或通用方法...
}

// 扩展抽象部分:CircleShape
public class CircleShape extends Shape {
   
    private double x, y, radius;

    public CircleShape(DrawingAPI drawingAPI, double x, double y, double radius) {
   
        super(drawingAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
   
        drawingAPI.drawCircle(x, y, radius);
    }
}

// 使用示例
public class BridgePatternDemo {
   
    public static void main(String[] args) {
   
        Shape basicCircle = new CircleShape(new BasicDrawingAPI(), 100, 50, 40);
        basicCircle.draw(); // 输出: Using BasicDrawingAPI to draw a circle...

        Shape advancedCircle = new CircleShape(new AdvancedDrawingAPI(), 100, 50, 40);
        advancedCircle.draw(); // 输出: Using AdvancedDrawingAPI to draw a circle...
    }
}

想象你正在设计一款画图软件,该软件支持不同类型的图形(如圆形、矩形等)和不同的渲染引擎(如简单的线条渲染、3D渲染等)。如果直接把渲染方式硬编码到图形类里,那么每次增加新的渲染方式就得修改所有图形类;反之,若将渲染方式作为可替换的组件,就可以灵活地选择不同的渲染方式绘制任何图形,这就像是给每个图形配备了一座“桥”,这座“桥”可以根据需求连接不同的渲染引擎。

应用场景

  • 软件系统需要独立扩展抽象与实现:例如图形用户界面库中的形状(如矩形、圆形等)与颜色渲染引擎(如SVG、OpenGL等)之间,形状可以独立于渲染方式变化,而渲染方式也可以独立于形状变化。
  • 多维度的变化不希望导致类爆炸:当有多个独立变化的维度时,使用桥接模式可以避免创建大量的条件分支或者子类。

适用性

  • 抽象和实现之间存在多对多关系的情况。
  • 当一个类有多个维度的变化,且这些变化需要独立进行扩展时。
  • 需要松散耦合的抽象化和实现化以便能够独立改变它们时。

相关推荐

  1. 设计模式

    2024-01-16 23:34:03       42 阅读
  2. 设计模式模式

    2024-01-16 23:34:03       53 阅读
  3. 设计模式——模式

    2024-01-16 23:34:03       56 阅读
  4. 设计模式-模式

    2024-01-16 23:34:03       56 阅读
  5. 设计模式-模式

    2024-01-16 23:34:03       57 阅读
  6. 设计模式模式

    2024-01-16 23:34:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-16 23:34:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-16 23:34:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-16 23:34:03       82 阅读
  4. Python语言-面向对象

    2024-01-16 23:34:03       91 阅读

热门阅读

  1. leetcode-平衡二叉树

    2024-01-16 23:34:03       52 阅读
  2. 代码随想录day29 回溯开始进入排列问题

    2024-01-16 23:34:03       51 阅读
  3. Python从入门到精通秘籍五

    2024-01-16 23:34:03       62 阅读
  4. c++关键字const

    2024-01-16 23:34:03       50 阅读
  5. 如何在 Edge 浏览器中设置自动刷新?

    2024-01-16 23:34:03       132 阅读
  6. Edge 浏览器设置自动刷新

    2024-01-16 23:34:03       51 阅读
  7. nginx使用入门的笔记

    2024-01-16 23:34:03       49 阅读
  8. C++中的23种设计模式精讲

    2024-01-16 23:34:03       49 阅读