Bridge 桥接

意图

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

结构

其中:

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

适用性

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

代码示例

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

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

我们希望能够在不修改 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 是一个抽象类,定义了形状的基本操作。
  • Circle 和 Square 是实现类,它们提供了具体形状的实现。
  • DrawAPI 是一个接口,定义了绘制形状所需的接口。
  • RedDrawAPI 和 GreenDrawAPI 是 DrawAPI 接口的实现,它们提供了使用不同颜色的绘制功能。
  • 客户端代码通过将 Shape 对象与 DrawAPI 对象关联来创建不同的形状和颜色组合。

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

相关推荐
SL_staff15 分钟前
制造业交付崩盘?用跨部门节点协同计划打通销售、生产与质量链路
java·开源·产品
文丑颜不良啊1 小时前
LeetCode2261~2280题目解析
java·leetcode
SL_staff1 小时前
告别规则黑盒:JVS-Rules 在金融风控中的可视化决策编排实践
java·产品·全栈
逃逸线LOF2 小时前
服务网关Gateway
java·运维·gateway
灿飞屋2 小时前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack
阡陌数智3 小时前
Claude API新版本重大变更与安全升级指南
java·linux·安全
学长毕设5 小时前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
SL_staff6 小时前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易6 小时前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
装不满的克莱因瓶6 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba