|
5 | 5 | | 结构型模式 | ★★★ :arrow_down: | ★★★★ :arrow_up: | ★★★★ :arrow_up: | :green_heart: :arrow_up: | :green_heart: :arrow_up: |
|
6 | 6 |
|
7 | 7 | ## 概念
|
8 |
| -桥接模式(`Bridge Pattern`):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(`Handle and Body`)模式或接口(`Interface`)模式。简单的说:桥模式更倾向于组合而不是继承,实现细节从层次结构推送到具有单独层次结构的另一个对象。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。 |
| 8 | +桥接模式(`Bridge Pattern`):将抽象部分与它的实现部分**分离**,使它们都可以**独立地变化**。它是一种**对象结构型模式**,又称为**柄体(`Handle and Body`)模式**或**接口(`Interface`)模式**。简单的说:桥模式更倾向于**组合而不是继承**,实现细节从**层次结构推送到具有单独层次结构的另一个对象**。桥接模式将**继承关系转换为关联关系**,从而降低了类与类之间的**耦合,减少了代码编写量**。 |
9 | 9 |
|
10 | 10 | ## 用途
|
11 |
| -桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 |
| 11 | +桥接模式就是**把事物和其具体实现分开**,使他们可以各自独立的变化。桥接的用意是:将**抽象化与实现化解耦**,使得二者可以独立变化。在有多种可能会变化的情况下,用**继承会造成类爆炸问题,扩展起来不灵活**。 |
12 | 12 |
|
13 | 13 | ## 模式架构
|
14 |
| -桥接模式的重点是理解如何将抽象化(`Abstraction`)与实现化(`Implementation`)解耦,使得二者可以独立地变化。 |
15 |
| -+ **抽象化**:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。 |
16 |
| -+ **实现化**:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。 |
17 |
| -+ **解耦**:解耦就是将抽象化和实现化之间的耦合解开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。 |
| 14 | +桥接模式的重点是理解**如何将抽象化(`Abstraction`)与实现化(`Implementation`)解耦,使得二者可以独立地变化**。 |
| 15 | ++ **抽象化**:抽象化就是**忽略一些信息**,把**不同的实体当作同样的实体对待**。在面向对象中,将对象的**共同性质抽取出来**形成类的过程即为抽象化的过程。 |
| 16 | ++ **实现化**:针对抽象化给出的**具体实现**,就是实现化,抽象化与实现化是一对**互逆**的概念,实现化产生的对象比抽象化**更具体**,是对抽象化事物的**进一步具体化的产物**。 |
| 17 | ++ **解耦**:解耦就是将**抽象化和实现化之间的耦合解开**,或者说是将它们之间的**强关联改换成弱关联**,将两个角色之间的**继承关系改为关联关系**。桥接模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是**继承关系**,从而使两者可以相对独立地变化,这就是桥接模式的用意。 |
18 | 18 |
|
19 | 19 |
|
20 | 20 | ### 参与角色对象
|
21 |
| -+ **Abstraction**:定义抽象类的接口,完成最终业务对象业务逻辑接口的定义 |
22 |
| -+ **RefinedAbstraction**:扩充抽象类,继承`Abstraction`,使用组合利用`Implementor`实现`Abstraction`父类的方法 |
23 |
| -+ **Implementor**:定义实现类接口,定义对应于`Abstraction`的相关方法实现,可以加入相应的业务逻辑行为 |
24 |
| -+ **ConcreteImplementor**:具体实现类,继承`Implementor`类并实现其所有方法 |
| 21 | ++ **`Abstraction` 定义抽象类的接口**:完成最终业务对象业务逻辑接口的定义 |
| 22 | ++ **`RefinedAbstraction` 扩充抽象类**:继承`Abstraction`,使用组合利用`Implementor`实现`Abstraction`父类的方法 |
| 23 | ++ **`Implementor` 定义实现类接口**:定义对应于`Abstraction`的相关方法实现,可以加入相应的业务逻辑行为 |
| 24 | ++ **`ConcreteImplementor` 具体实现类**:继承`Implementor`类并实现其所有方法 |
25 | 25 |
|
26 | 26 | ### UML关系图
|
27 | 27 |
|
|
30 | 30 | ## 优点与缺点
|
31 | 31 | + **优点**
|
32 | 32 | - **抽象和实现的分离**:**分离**抽象接口及其实现部分。
|
33 |
| - - 桥接模式有时类似于多继承方案,但是多继承方案违背了类的**单一职责原则**(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。 |
34 |
| - - **优秀的扩展能力**:桥接模式提高了系统的**可扩充性**,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。 |
35 |
| - - **实现细节对客户透明**:可以对用户隐藏实现细节。 |
| 33 | + - 桥接模式有时类似于多继承方案,但是多继承方案违背了类的**单一职责原则**(即一个类只有一个变化的原因),**复用性比较差**,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。 |
| 34 | + - **优秀的扩展能力**:桥接模式提高了系统的**可扩充性**,在两个变化维度中任意扩展一个维度,都**不需要修改原有系统**。 |
| 35 | + - **实现细节对客户透明**:可以对用户**隐藏实现细节**。 |
36 | 36 |
|
37 | 37 | + **缺点**
|
38 |
| - - 桥接模式的引入会**增加系统的理解与设计难度**,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 |
| 38 | + - 桥接模式的引入会**增加系统的理解与设计难度**,由于聚合关联关系建立在抽象层,要求开发者针对**抽象进行设计与编程**。 |
39 | 39 | - 桥接模式要求正确识别出系统中两个**独立变化的维度**,因此其使用范围**具有一定的局限性**。
|
40 | 40 |
|
41 | 41 | ## 代码实现
|
|
54 | 54 | + **抽象及其实现都应该通过子类化来扩展**。在这种情况下,桥接模式允许**组合**不同的抽象和实现并独立扩展它们。
|
55 | 55 | + **抽象实现的变化应该对客户没有影响**, 也就是说,他们的代码不应该被重新编译。
|
56 | 56 | + 在**多个对象之间共享一个实现**(可能使用引用计数),这个事实应该从客户端隐藏。一个简单的例子是`Coplien`的`String`类,其中多个对象可以共享相同的字符串表示。
|
57 |
| -+ 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 |
58 |
| -+ 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。 |
59 |
| -+ 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 |
| 57 | ++ 对于那些不希望使用继承或因为多层次继承导致**系统类的个数急剧增加**的系统,桥接模式尤为适用。 |
| 58 | ++ 一个类存在**两个独立变化**的维度,且这**两个维度都需要进行扩展**。 |
| 59 | ++ 如果一个系统需要在构件的抽象化角色和具体化角色之间**增加更多的灵活性**,避免在两个层次之间**建立静态的继承联系**,通过桥接模式可以使它们在抽象层建立一个关联关系。 |
60 | 60 |
|
61 | 61 | ## 应用实例参考
|
62 | 62 |
|
|
73 | 73 |
|
74 | 74 |
|
75 | 75 | ## 总结
|
76 |
| -+ 桥接模式(`Bridge Pattern`):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(`Handle and Body`)模式或接口(`Interface`)模式。 |
77 |
| -+ 简单的说:桥模式更倾向于组合而不是继承,实现细节从层次结构推送到具有单独层次结构的另一个对象。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。 |
78 |
| -+ 桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 |
79 |
| -+ 桥接模式的参与角色有:`Abstraction` 定义抽象类的接口、`RefinedAbstraction`扩充抽象类、`Implementor`定义实现类接口、`ConcreteImplementor`具体实现类 |
80 |
| -+ 桥接模式优点有:抽象和实现的分离、优秀的扩展能力、细节对客户透明 |
81 |
| -+ 桥接模式适用于:避免抽象与其实现之间的永久绑定、抽象及其实现都应该通过子类化来扩展、抽象实现的变化应该对客户没有影响、多个对象之间共享一个实现 |
82 |
| - |
83 |
| - |
84 |
| -## 参考资料 |
85 |
| - |
86 |
| - |
87 |
| - |
| 76 | ++ 桥接模式将**抽象部分与它的实现部分分离**,使它们都可以**独立地变化**。它是一种对象结构型模式,又称为柄体(`Handle and Body`)模式或接口(`Interface`)模式。 |
| 77 | ++ 简单的说:桥模式更倾向于**组合**而不是继承,实现细节从层次结构推送到具有单独层次结构的另一个对象。桥接模式将**继承关系转换为关联关系**,从而**降低了类与类之间的耦合,减少了代码编写量**。 |
| 78 | ++ 桥接的用意是:将抽象化与实现化**解耦**,使得二者可以**独立变化**。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 |
| 79 | ++ 桥接模式的参与角色有:`Abstraction` 定义抽象类的接口、`RefinedAbstraction`扩充抽象类、`Implementor`定义实现类接口、`ConcreteImplementor`具体实现类。 |
| 80 | ++ 桥接模式优点有:**抽象和实现的分离、优秀的扩展能力、细节对客户透明**。 |
| 81 | ++ 桥接模式适用于:避免抽象与其实现之间的**永久绑定**、抽象及其实现都应该通过**子类化来扩展**、抽象实现的变化应该**对客户没有影响、多个对象之间共享一个实现**。 |
88 | 82 |
|
89 | 83 |
|
0 commit comments