1、出现原因

1同一个类型,两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象)

 

2如何应对这种“多维度的变化”?如何利用面向对象技术来使得同一类型可以轻松地沿着两个方向变化,而不引入额外的复杂度?

 

2、具体的例子

数据库操作

   操作类型:增删改查  (具体功能的实现部分)

   操作对象:客户,订单,产品…(对应上面的增删改查是 1对多的关系(通过聚合关系联系起来)

手机软件

   软件功能:通讯录,游戏

   支持品牌:M(摩托骡拉),N(喏鸡呀)

计算机软件

   软件功能:游戏,开发工具,绘图软件…

   运行平台:Windows,Unix.

 

过度的使用继承:

    ——以手机软件为例:

以手机品牌分类:

 设计模式之Birdge(桥接)模式

以手机软件分类:

设计模式之Birdge(桥接)模式

我们仔细观察,如果给上面的增加一个手机软件,,那么每个手机品牌都要增加这个手机软件,都要变化,耦合度太高了。

 

使用桥接模式重构上面的:

设计模式之Birdge(桥接)模式

3、意图:

抽象部分实现部分分离,使它们都可以独立地变化

 

4、结构图:

设计模式之Birdge(桥接)模式

5、代码演示

 1     //桥接模式:两个维度的变化(一个是抽象,一个是实现),并且 这两个维度 是一对多的(抽象 1对多 实现)/聚合 关系;通过桥接模式将 两个维度(抽象和实现) 隔离。将 两个维度的变化 封装起来,不管一个维度 怎么 变化 都不会影响另一个维度的 变化。。所以 耦合度 降低了 很多(相比以前的  继承关系)
 2 
 3 
 4     //第一个维度(实现部分)
 5     public interface IPhoneSoftware
 6     {
 7         void Start();
 8     }
 9 
10 
11 
12     //第二个维度(抽象部分)
13 
14     public abstract class PhoneBrand
15     {
16         private List<IPhoneSoftware> phoneSoftwares = new List<IPhoneSoftware>();
17 
18         public void Instance(IPhoneSoftware software)
19         {
20             phoneSoftwares.Add(software);
21         }
22 
23 
24         public void StareAllSoftware()
25         {
26             if (phoneSoftwares.Count <= 0)
27             {
28                 throw new Exception("没有可以执行的手机软件!");
29             }
30             else
31             {
32                 foreach (var item in phoneSoftwares)
33                 {
34                     item.Start();
35                 }
36             }
37         }
38     }
39 
40 
41     //第一个维度(实现部分:实现的功能)
42     public class KuGou : IPhoneSoftware
43     {
44         public void Start()
45         {
46             Console.WriteLine("酷狗音乐已经开启,可以欣赏音乐了!");
47         }
48     }
49 
50     public class QQ : IPhoneSoftware
51     {
52         public void Start()
53         {
54             Console.WriteLine(" QQ已经开启了,可以进行聊天了!");
55         }
56     }
57 
58 
59     //第二个维度(抽象部分的具体的)
60     public class Samsung : PhoneBrand
61     {
62 
63     }
64 
65     public class Iphone : PhoneBrand
66     {
67     }

Birdge模式