1、出现原因
1、同一个类型,有两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象)
2、如何应对这种“多维度的变化”?如何利用面向对象技术来使得同一类型可以轻松地沿着两个方向变化,而不引入额外的复杂度?
2、具体的例子
数据库操作
操作类型:增删改查 (具体功能的实现部分)
操作对象:客户,订单,产品…(对应上面的增删改查是 1对多的关系(通过聚合关系联系起来))
手机软件
软件功能:通讯录,游戏
支持品牌:M(摩托骡拉),N(喏鸡呀)
计算机软件
软件功能:游戏,开发工具,绘图软件…
运行平台:Windows,Unix….
过度的使用继承:
——以手机软件为例:
以手机品牌分类:
以手机软件分类:
我们仔细观察,如果给上面的增加一个手机软件,,那么每个手机品牌都要增加这个手机软件,都要变化,耦合度太高了。
使用桥接模式重构上面的:
3、意图:
将抽象部分与实现部分分离,使它们都可以独立地变化。
4、结构图:
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模式
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:设计模式之Birdge(桥接)模式 - Python技术站