你好!我们继续了解一个广泛且非常有用的主题——设计模式。今天我们就来说说桥。与其他模式一样,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()
,我们需要为与颜色相对应的每个形状创建一个类。如果有三种颜色,则有六个类别:TriangleBlack
、TriangleGreen
、TriangleRed
、RectangleBlack
和RectangleGreen
。RectangleRed
六节课并不是什么大不了的事。但!如果我们需要添加新的形状或颜色,类的数量将呈指数级增长。如何摆脱这种困境?在字段中存储颜色并通过条件尝试选项并不是最好的解决方案。一个好的解决方案是在单独的界面中显示颜色。说到做到:让我们创建一个接口Color
及其三个实现 - BlackColor
、GreenColor
和RedColor
:
-
颜色.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
是互连两个独立的类层次结构的桥梁。
桥接设备:什么是抽象和实现
让我们看一下描述桥接模式的类图: 在这里您可以看到两个独立的结构,可以修改它们而不影响彼此的功能。在我们的例子中是:- 抽象类
Shape
; - RefinedAbstraction - 类
Triangle
,Rectangle
; - 实现者-接口
Color
; - ConcreteImplementor-类
BlackColor
,GreenColor
和RedColor
。
Shape
代表一个抽象 - 一种用于控制不同颜色的形状着色的机制,它将实现委托给接口Color
。类Triangle
是Rectangle
使用类提供的机制的真实对象Shape
。 BlackColor
,GreenColor
以及RedColor
- 实施分支中的具体实施。它们通常被称为平台。
桥接模式用在哪里?
使用此模式的一个巨大优点是,您可以更改一个分支中的类的功能,而不会破坏另一个分支的逻辑。这种方法还有助于减少程序类的耦合。使用图案的主要条件是“遵循说明”:不要将它们粘在任何地方!实际上,让我们弄清楚在什么情况下你肯定需要使用 Bridge:-
如果需要在两个方向(几何形状、颜色)扩展实体数量。
-
如果您想将不符合单一责任原则的大类划分为具有窄配置功能的较小类。
-
如果程序运行时可能需要更改某些实体的操作逻辑。
-
如有必要,对类(库)客户端隐藏实现。
该模式的优点和缺点
与其他模式一样,桥接模式既有优点也有缺点。 桥的好处:- 提高代码可扩展性 - 您可以添加功能,而不必担心破坏程序其他部分的某些内容。
- 减少子类的数量 - 当需要在两个方向上扩展实体的数量(例如,形状的数量和颜色的数量)时有效。
- 使得可以分别在抽象和实现的两个独立分支上工作——这可以由两个不同的开发人员完成,而无需深入研究彼此代码的细节。
- 减少类的耦合——两个类唯一连接的地方就是桥(字段
Color color
)。
- 根据具体情况和整个项目的结构,可能会对程序生产力产生负面影响(例如,如果需要初始化更多对象)。
- 由于需要在类之间导航,使代码可读性变得复杂。
GO TO FULL VERSION