你好!我们现在继续深入研究一个广泛且非常重要的有用主题:设计模式。今天我们就来说说桥接模式。与其他模式一样,桥接模式用于解决开发人员在设计软件架构时遇到的典型问题。今天让我们来研究一下这个模式的特点,并了解如何使用它。
什么是桥梁模式?
桥接模式是一种结构设计模式。换句话说,它的主要工作是从类和对象中创建一个成熟的结构。桥通过将一个或多个类划分为单独的层次结构来实现这一点:抽象和实现。一个层次结构中功能的变化并不意味着另一个层次结构的变化。这很好,但是这个定义非常宽泛,没有回答最重要的问题:“什么是桥接模式?” 我想你会更容易理解它的实际应用。那么马上,让我们为桥接模式创建一个经典场景。我们有一个抽象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(); }
-
黑颜色.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
在哪里使用桥接模式
使用此模式的一个巨大好处是,您可以在不破坏另一个层次结构的逻辑的情况下更改一个层次结构中的功能类。此外,这种方法有助于减少类之间的耦合。使用此模式时的主要要求是“遵循说明”——不要忽略其中的任何一个!为此,让我们弄清楚什么情况下你绝对应该使用桥接模式:-
如果您需要根据两个概念(例如形状和颜色)的组合来扩展实体的数量。
-
如果你想把一个不符合单一职责原则的大类分成功能狭窄的小类。
-
如果需要在程序运行时对某些实体的逻辑进行更改。
-
如果有必要对类或库的客户端隐藏实现。
模式的优缺点
与其他模式一样,桥既有优点也有缺点。 桥接模式的优点:- 它提高了代码的可扩展性——你可以添加功能而不用担心破坏程序的其他部分。
- 当实体数量基于两个概念(例如,形状和颜色)的组合时,它减少了子类的数量。
- 它使得分别在两个独立的层次结构上工作成为可能——抽象和实现。两个不同的开发人员可以在不深入研究彼此代码细节的情况下进行更改。
- 它减少了类之间的耦合——两个类唯一耦合的地方是桥(即域
Color color
)。
- 根据具体情况和项目的整体结构,它可能会对程序的性能产生负面影响(例如,如果您需要初始化更多对象)。
- 由于需要在两个类之间切换,它使代码的可读性降低。
GO TO FULL VERSION