• 桥接模式简介


    概念

    桥接模式是一种结构型设计模式,它将抽象和实现分离,使它们可以独立地变化。通过使用桥接模式,可以将一个类的抽象部分与其具体实现部分解耦,并且可以在运行时动态地选择不同的实现。

    特点

    1. 将抽象和实现分离,使它们可以独立变化。
    2. 通过组合而不是继承来连接抽象和实现。
    3. 提高了系统的可扩展性、灵活性和可维护性。

    优点

    1. 解耦了抽象和具体实现,使得二者能够独立进行扩展。
    2. 提供了更好的灵活性,在运行时能够动态地切换或替换具体实现。
    3. 对于客户端来说,隐藏了底层的细节。

    缺点

    1. 增加了系统复杂度,需要额外创建多个类以及相应的关联关系。
    2. 在某些情况下可能会导致过度设计。

    适用场景

    1. 当一个类存在两个或多个独立变化的维度时(例如颜色与形状),并且希望避免使用大量子类组合时。
    2. 当需要在运行时动态选择不同的具体实现时。
    3. 当希望将抽象和实现部分分离,以便独立进行扩展和修改时。

    实现方式

    抽象化(Abstraction)角色通过一个成员变量持有具体实施者(Concrete Implementor)角色的引用。这个成员变量充当了抽象化角色和具体实施者角色之间的桥梁。通过将抽象化角色和具体实施者角色解耦,使得它们可以独立地进行扩展和修改。

    实现代码:

    1. // 实施者接口(Implementor)
    2. interface DrawingAPI {
    3. void drawCircle(double x, double y, double radius);
    4. }
    5. // 具体实施者类(Concrete Implementor)实现实施者接口
    6. class DrawingAPI1 implements DrawingAPI {
    7. @Override
    8. public void drawCircle(double x, double y, double radius) {
    9. System.out.printf("Drawing Circle[ API 1 ]: (%f,%f) with radius %f\n", x, y, radius);
    10. }
    11. }
    12. class DrawingAPI2 implements DrawingAPI {
    13. @Override
    14. public void drawCircle(double x, double y, double radius) {
    15. System.out.printf("Drawing Circle[ API 2 ]: (%f,%f) with radius %f\n", x, y, radius);
    16. }
    17. }
    18. // 抽象化类(Abstraction)
    19. abstract class Shape {
    20. protected DrawingAPI drawingAPI;
    21. protected Shape(DrawingAPI drawingAPI) {
    22. this.drawingAPI = drawingAPI;
    23. }
    24. public abstract void draw();
    25. }
    26. // 扩展抽象化类(Refined Abstraction)
    27. class CircleShape extends Shape {
    28. private double x, y, radius;
    29. public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
    30. super(drawingAPI);
    31. this.x = x;
    32. this.y = y;
    33. this.radius = radius;
    34. }
    35. @Override
    36. public void draw() {
    37. drawingAPI.drawCircle(x, y, radius);
    38. }
    39. }
    40. public class Main {
    41. public static void main(String[] args) {
    42. Shape redCircle = new CircleShape(100.0f, 100.0f, 10.0f,
    43. new DrawingAPI1());
    44. Shape greenCircle = new CircleShape(200.0f, 200.0f, 20.0f,
    45. new DrawingAPI1());
    46. redCircle.draw();
    47. greenCircle.draw();
    48. }
    49. }

    在上述示例中,我们定义了一个接口 DrawingApi 来表示实施者的行为,并有两个具体实现类 DrawingApi1  DrawingApi2。然后,我们创建了一个抽象类 Shape,它包含一个成员变量 drawingApi 来持有具体实施者的引用,并提供了一个抽象方法 draw()。最后,我们创建了扩展抽象化的子类 CircleShape,它通过调用 drawingApi 的方法来实现具体的绘制逻辑。

    在主函数中,我们创建了两个不同颜色的圆形对象,并调用它们的 draw() 方法来进行绘制。由于抽象化角色和具体实施者角色解耦,我们可以轻松地切换不同的具体实施者类来改变绘制效果。

    存在问题:

    1. 桥接模式增加了额外的类和关联关系,导致系统复杂度增加。
    2. 如果只有少量的维度需要进行分离,则使用桥接模式可能会显得过于冗余。

  • 相关阅读:
    【题解】自创题目题解
    Java计算两个日期之间的工作时长【包含节假日、补班、周末】
    【Linux线程】一、什么是线程
    Spring Boot 请求/actuator/beans 无法访问 返回404
    Scrum敏捷开发企业培训大纲介绍-企业内训
    Pytorch学习笔记 (参考官方教程)
    Java小游戏:趣味猜数字
    正则表达式和grep命令
    svn客户端下载、安装、使用
    从HashMap的执行流程开始 揭开HashMap底层实现
  • 原文地址:https://blog.csdn.net/aidscooler/article/details/132730920