Bridge 桥接

意图

将抽象部分与其显示部分分离,使他们都可以独立地变化。

结构

其中:

  • Abstraction定义抽象类的接口,维护一个指向Implementer类型对象的指针。
  • RefinedAbstraction扩展由Abstraction定义的接口。
  • Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同,一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
  • ConcreteImplementor实现Implementor接口并定义他的具体实现

适用性

  • 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  • 累的抽象以及他的实现都有该可以通过生成子类的方法来加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译,(C++)相对客户完全隐藏抽象的实现部分。
  • 许多类需要生成的层次结构。
  • 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

代码示例

桥接设计模式是一种结构型设计模式,它将抽象部分与实现部分分离,从而使两者可以独立变化。

假设我们有一个 Shape 抽象类,它定义了形状的基本操作。我们还有两个实现类 CircleSquare,它们提供了具体形状的实现。

我们希望能够在不修改 Shape 抽象类的情况下向系统添加新的形状。

java 复制代码
// 抽象形状类
abstract class Shape {

    protected DrawAPI drawAPI;

    protected Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    public abstract void draw();
}

// 圆形类
class Circle extends Shape {

    public Circle(DrawAPI drawAPI) {
        super(drawAPI);
    }

    @Override
    public void draw() {
        drawAPI.drawCircle();
    }
}

// 正方形类
class Square extends Shape {

    public Square(DrawAPI drawAPI) {
        super(drawAPI);
    }

    @Override
    public void draw() {
        drawAPI.drawSquare();
    }
}

// 绘制 API 接口
interface DrawAPI {

    void drawCircle();
    void drawSquare();
}

// 红色绘制 API 实现
class RedDrawAPI implements DrawAPI {

    @Override
    public void drawCircle() {
        System.out.println("使用红色绘制圆形");
    }

    @Override
    public void drawSquare() {
        System.out.println("使用红色绘制正方形");
    }
}

// 绿色绘制 API 实现
class GreenDrawAPI implements DrawAPI {

    @Override
    public void drawCircle() {
        System.out.println("使用绿色绘制圆形");
    }

    @Override
    public void drawSquare() {
        System.out.println("使用绿色绘制正方形");
    }
}

// 客户端代码
public class Client {

    public static void main(String[] args) {
        DrawAPI redDrawAPI = new RedDrawAPI();
        DrawAPI greenDrawAPI = new GreenDrawAPI();

        Shape redCircle = new Circle(redDrawAPI);
        Shape greenSquare = new Square(greenDrawAPI);

        redCircle.draw();
        greenSquare.draw();
    }
}
  • Shape 是一个抽象类,定义了形状的基本操作。
  • CircleSquare 是实现类,它们提供了具体形状的实现。
  • DrawAPI 是一个接口,定义了绘制形状所需的接口。
  • RedDrawAPIGreenDrawAPIDrawAPI 接口的实现,它们提供了使用不同颜色的绘制功能。
  • 客户端代码通过将 Shape 对象与 DrawAPI 对象关联来创建不同的形状和颜色组合。

桥接模式将抽象部分(Shape)与实现部分(DrawAPI)分离,从而使两者可以独立变化。我们可以轻松地添加新的形状或绘制 API 实现,而无需修改其他部分。

相关推荐
码农秋1 分钟前
设计模式系列(10):结构型模式 - 桥接模式(Bridge)
设计模式·桥接模式
GodKeyNet2 分钟前
设计模式-桥接模式
java·设计模式·桥接模式
guojl1 小时前
Java多任务编排技术
java
丶意冷1 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH1 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程2 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码
蓝澈11212 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_073 小时前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl023 小时前
java web5(黑马)
java·开发语言·前端
时序数据说3 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb