JavaRush /Java 博客 /Random-ZH /桥梁设计模式

桥梁设计模式

已在 Random-ZH 群组中发布
你好!我们继续了解一个广泛且非常有用的主题——设计模式。今天我们就来说说桥。与其他模式一样,Bridge 旨在解决开发人员在设计软件架构时面临的常见问题。今天我们就来研究一下它的特性并了解一下如何使用它。

什么是桥接模式?

桥接模式是一种结构设计模式。也就是说,它的主要任务是创建一个完整的类和对象结构。Bridge 通过将一个或多个类分成单独的层次结构(抽象实现)来解决这一问题。一个层次结构中功能的更改不会引起另一层次结构中功能的更改。一切看起来都很清楚,但事实上这个定义听起来很宽泛,并没有回答主要问题:“什么是桥接模式?” 我认为这对你来说在实践中会更容易理解。让我们立即为桥接模式构建一个经典示例。我们有一个抽象类Shape,通常描述一个几何图形:
  • 形状.java

    public abstract class Shape {
       public abstract void draw();
    }

    当我们决定添加三角形和矩形形状时,我们将从该类继承Shape

  • 矩形.java:

    public class Rectangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
       }
    }
  • 三角形.java:

    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
一切看起来都很简单,直到我们引入“颜色”的概念。也就是说,每个图形都有自己的颜色,该方法的功能取决于该颜色draw()。为了有该方法的不同实现draw(),我们需要为与颜色相对应的每个形状创建一个类。如果有三种颜色,则有六个类别:TriangleBlackTriangleGreenTriangleRedRectangleBlackRectangleGreenRectangleRed六节课并不是什么大不了的事。但!如果我们需要添加新的形状或颜色,类的数量将呈指数级增长。如何摆脱这种困境?在字段中存储颜色并通过条件尝试选项并不是最好的解决方案。一个好的解决方案是在单独的界面中显示颜色。说到做到:让我们创建一个接口Color及其三个实现 - BlackColorGreenColorRedColor
  • 颜色.java:

    public interface Color {
       void fillColor();
    }
  • BlackColor.java:

    public class BlackColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in black color");
       }
    }
  • 绿色颜色.java

    public class GreenColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in green color");
       }
    }
  • 红颜色.java

    public class RedColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in red color");
       }
    }

    现在让我们Color向类添加一个类型字段Shape- 我们将在构造函数中接收它的值。

  • 形状.java:

    public abstract class Shape {
       protected Color color;
    
       public Shape(Color color) {
           this.color = color;
       }
    
       public abstract void draw();
    }

    color我们将在实现中使用该变量Shape。这意味着形状现在可以使用该界面的功能Color

  • 矩形.java

    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
干得好!现在我们可以无限地产生不同的颜色和几何形状,从而增加算术级数中的类别数量。该字段Color color是互连两个独立的类层次结构的桥梁。

桥接设备:什么是抽象和实现

让我们看一下描述桥接模式的类图: Bridge 设计模式简介 - 2在这里您可以看到两个独立的结构,可以修改它们而不影响彼此的功能。在我们的例子中是:
  • 抽象类Shape
  • RefinedAbstraction - 类TriangleRectangle
  • 实现者-接口Color
  • ConcreteImplementor-类BlackColorGreenColorRedColor
该类Shape代表一个抽象 - 一种用于控制不同颜色的形状着色的机制,它将实现委托给接口Color。类TriangleRectangle使用类提供的机制的真实对象ShapeBlackColorGreenColor以及RedColor- 实施分支中的具体实施。它们通常被称为平台。

桥接模式用在哪里?

使用此模式的一个巨大优点是,您可以更改一个分支中的类的功能,而不会破坏另一个分支的逻辑。这种方法还有助于减少程序类的耦合。使用图案的主要条件是“遵循说明”:不要将它们粘在任何地方!实际上,让我们弄清楚在什么情况下你肯定需要使用 Bridge:
  1. 如果需要在两个方向(几何形状、颜色)扩展实体数量。

  2. 如果您想将不符合单一责任原则的大类划分为具有窄配置功能的较小类。

  3. 如果程序运行时可能需要更改某些实体的操作逻辑。

  4. 如有必要,对类(库)客户端隐藏实现。

每次使用模式时,您需要记住它会向代码中添加额外的实体 - 在只有一个几何图形和一两种可能的颜色的项目中使用它并不完全符合逻辑。

该模式的优点和缺点

与其他模式一样,桥接模式既有优点也有缺点。 桥的好处:
  1. 提高代码可扩展性 - 您可以添加功能,而不必担心破坏程序其他部分的某些内容。
  2. 减少子类的数量 - 当需要在两个方向上扩展实体的数量(例如,形状的数量和颜色的数量)时有效。
  3. 使得可以分别在抽象和实现的两个独立分支上工作——这可以由两个不同的开发人员完成,而无需深入研究彼此代码的细节。
  4. 减少类的耦合——两个类唯一连接的地方就是桥(字段Color color)。
桥接的缺点:
  1. 根据具体情况和整个项目的结构,可能会对程序生产力产生负面影响(例如,如果需要初始化更多对象)。
  2. 由于需要在类之间导航,使代码可读性变得复杂。

与策略模式的区别

桥接模式经常与另一种设计模式“策略”相混淆。它们都通过将工作委托给其他对象来使用组合(在形状和颜色示例中我们使用聚合,但桥接模式也可以使用组合)。但他们之间是有区别的,而且是巨大的。策略模式是一种行为模式:它解决完全不同的问题。策略允许算法可以互换,而桥则将抽象与实现分开,以允许在不同的实现之间进行选择。也就是说,与策略不同,桥接适用于整个构造或层次结构。桥接模式可以成为开发人员武器库中的一个好武器;主要是找到值得使用它的情况,或者使用其他模式。如果您还不熟悉其他模板,请阅读以下材料:
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION