设计模式13-Bridge

本文最后更新于:3 years ago

桥接模式

  桥接模式(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于 结构型模式 ,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

如果想了解桥接模式的具体的介绍,菜鸟教程介绍得比较详细↓
菜鸟教程-桥接模式

结构图


优缺点

优点:

1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。

缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

实现代码

这个模式也简单,这里也简单介绍一下
主要掌握聚合思想

首先,提出需求,要求创建一个物体(类),一个键盘(类),要求是灰色(类)的。
也就是要创建三个类

很简单,正常代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Black{
public Black() {
System.out.println("Black was created");
}
}

public class KeyBoard extends Black{
public KeyBoard() {
System.out.println("KeyBoard was created");
}
}

public class SimpleObj extends Black{
public SimpleObj() {
System.out.println("SimpleObj was created");
}
}

public class Main {
public static void main(String[] args) {
SimpleObj simpleObj = new SimpleObj();
}
}

很简单的代码
但是当你写这段代码的时候,有没有感觉哪里不对吗?
要需要实现多个继承真的很烦人,
但不仅仅是烦人,当提出下一个需求时,你就知道问题出在哪里了

新的需求:这里不仅仅是键盘了,我不光光想要黑色的键盘,我还想要一个白色的键盘和一个白色的Airports

好了,你写吧,等你写完了,我再来两个颜色和物品
现在看出来了吧,问题就出在这里了,耦合性太高了
所以这里我们要想办法解耦,而桥接模式就很好解决了这个问题

基本思路:

把抽象化与实现化解耦,这里就是把描述物品的状态(颜色)和具体物品(键盘)进行解耦
创建一个 SimpleObjImpl 类(这里也可以是接口),当我们创建 KeyBoard、AirPorts 时,继承这个类;
创建一个 SimpleObj 类,其中定义一个 SimpleObjImpl 类,当我们创建 Black、White 时,继承这个类,并且在创建这些具体类时,需要往其中传入 SimpleObjImpl 对象;

此时,当我们在创建一个想要的类时,就可以随意定制自己想要的 Object 了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class SimpleObjImpl {
}

public class Airports extends SimpleObjImpl{
public Airports() {
System.out.println("Airports was created");
}
}

public class KeyBoard extends SimpleObjImpl{
public KeyBoard() {
System.out.println("KeyBoard was created");
}
}

public class SimpleObj {
SimpleObjImpl simpleObj;
}

public class Black extends SimpleObj{
public Black(SimpleObjImpl simpleObj) {
System.out.println("Black was created");
this.simpleObj = simpleObj;
}
}

public class White extends SimpleObj{
public White(SimpleObjImpl simpleObj) {
System.out.println("White was created");
this.simpleObj = simpleObj;
}
}

public class Main {
public static void main(String[] args) {
SimpleObj simpleObj = new Black(new KeyBoard());
SimpleObj simpleObj1 = new White(new Airports());
}

}

是不是就思路清晰了,主要是要将抽象化与实现化解耦
这就是聚合,之前的模式我们也提到过了这个思想
上面的案例中
聚合类中的构造函数(White、Black)需要把 SimpleObjImpl 作为参数传入,而 SimpleObjImpl 类可以脱离 White(Black) 独立存在


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!