CodeGym /Java 博客 /随机的 /桥梁设计模式
John Squirrels
第 41 级
San Francisco

桥梁设计模式

已在 随机的 群组中发布
你好!我们现在继续深入研究一个广泛且非常重要的有用主题:设计模式。今天我们就来说说桥接模式。与其他模式一样,桥接模式用于解决开发人员在设计软件架构时遇到的典型问题。今天让我们来研究一下这个模式的特点,并了解如何使用它。

什么是桥梁模式?

桥接模式是一种结构设计模式。换句话说,它的主要工作是从类和对象中创建一个成熟的结构。桥通过将一个或多个类划分为单独的层次结构来实现这一点:抽象实现。一个层次结构中功能的变化并不意味着另一个层次结构的变化。这很好,但是这个定义非常宽泛,没有回答最重要的问题:“什么是桥接模式?” 我想你会更容易理解它的实际应用。那么马上,让我们为桥接模式创建一个经典场景。我们有一个抽象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具有三个实现的接口:BlackColor,GreenColorRedColor:
  • 颜色.java:

    
    public interface Color {
       void fillColor();
    }
    
  • 黑颜色.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是连接两个独立的类层次结构的桥梁。

如何搭建一座桥梁:抽象与实现

让我们看一个描述桥接模式的类图: 桥梁设计模式介绍 - 2在这里您可以看到两个独立的结构,它们可以修改而不会影响彼此的功能。在我们的例子中:
  • 抽象就是Shape
  • RefinedAbstraction 是TriangleRectangle
  • 实现者是Color接口
  • ConcreteImplementor 是BlackColor,GreenColorRedColor类。
该类Shape是一种抽象——一种管理用各种颜色填充形状的机制,它委托给接口Color(实现者)。和类是使用类提供的机制的具体Triangle类。 ,并且是实现层次结构中的具体实现。RectangleShapeBlackColorGreenColorRedColor

在哪里使用桥接模式

使用此模式的一个巨大好处是,您可以在不破坏另一个层次结构的逻辑的情况下更改一个层次结构中的功能类。此外,这种方法有助于减少类之间的耦合。使用此模式时的主要要求是“遵循说明”——不要忽略其中的任何一个!为此,让我们弄清楚什么情况下你绝对应该使用桥接模式:
  1. 如果您需要根据两个概念(例如形状和颜色)的组合来扩展实体的数量。

  2. 如果你想把一个不符合单一职责原则的大类分成功能狭窄的小类。

  3. 如果需要在程序运行时对某些实体的逻辑进行更改。

  4. 如果有必要对类或库的客户端隐藏实现。

当您使用此模式时,请始终记住它会向您的代码添加额外的实体——在只有一种形状和一种或两种可能颜色的项目中使用它可能没有意义。

模式的优缺点

与其他模式一样,桥既有优点也有缺点。 桥接模式的优点:
  1. 它提高了代码的可扩展性——你可以添加功能而不用担心破坏程序的其他部分。
  2. 当实体数量基于两个概念(例如,形状和颜色)的组合时,它减少了子类的数量。
  3. 它使得分别在两个独立的层次结构上工作成为可能——抽象和实现。两个不同的开发人员可以在不深入研究彼此代码细节的情况下进行更改。
  4. 它减少了类之间的耦合——两个类唯一耦合的地方是桥(即域Color color)。
桥接模式的缺点:
  1. 根据具体情况和项目的整体结构,它可能会对程序的性能产生负面影响(例如,如果您需要初始化更多对象)。
  2. 由于需要在两个类之间切换,它使代码的可读性降低。

与策略模式的区别

桥接模式经常与另一种设计模式——策略混淆。它们都使用组合(尽管我们在示例中使用图形和颜色的聚合,桥接模式也可以使用组合),将工作委托给其他对象。但是它们之间是有区别的,而且是巨大的。策略模式是一种行为模式:它解决的是完全不同的问题。Strategy 允许算法互换,而 bridge 将抽象与实现分开,以便在不同的实现之间进行选择。换句话说,与策略不同,桥梁适用于整个实体或层次结构。桥接模式可以成为开发人员武器库中的好武器。最主要的是确定值得使用它的情况,并识别何时其他模式是合适的。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION