这是一个很美丽的,千古流传的爱情故事,每到农历七月初七,相传牛郎织女鹊桥相会的日子,牛郎和织女被银河隔开,只允许每年的农历七月七日相见。为了让牛郎和织女能顺利相会。各地的喜鹊就会飞过来用大家的身体紧贴着搭成一座桥,此桥就叫做鹊桥。牛郎和织女便在这鹊桥上相会。我就会抬头仰望星空,寻找银河两边的牛郎星和织女星,希望能看到他们一年一度的相会......
在牛郎织女相会的过程中,喜鹊是功不可没的大臣,我们今天的设计模式就从鹊桥开始说起---桥接模式,顾名思义,在接口与实现之间,架设一座桥梁,这座桥,其实并非是为了过河,也不是为了让牛郎织女相会,那是人家喜鹊的事儿,咱要符合单一职责原则,干好自己的事儿,那就是将抽象部分与她的实现部分分离,使她都可以独立地变化。首先来看一下我们桥接模式的结构图:
为了更好的理解桥接模式,我们再来举一个例子,走进南四楼的机房,你除了看到一个个认真敲代码的孩子之外,还会看到大家使用的电脑,有惠普,联想,操作系统有Win7、Win8,由此我们可以画一个类图,如下所示:
全国人民都知道,电脑的品牌除了惠普和联想,还有戴尔、宏碁、华硕等;操作系统除了Win7和Win8之外,还有XP、Linux,如此一来,上面的结构图,似乎美中有着不足,改善一下我们的类图,如下:
我们来分析一下上面的两张图,可以发现一个是用继承完成的,一种是用组合/聚合的方式完成的,而采用组合/聚合的方式就是所谓的抽象与实现分离。实际上在设计类时,我们应该首先考虑的是组合/聚合的方式,而不是考虑继承的方式,因为继承是一种强耦合关系,使用继承使得子类过多的依靠父类,接着,我们来看一下代码实现:
<span style="font-size:18px;">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ComputerBrand ss; ss = new ComputerBrandH(); ss.SetComputerOperatingSystem(new Win7() ); ss.Run (); ss.SetComputerOperatingSystem(new Win8 ()); ss.Run (); ss = new ComputerBrandL(); ss.SetComputerOperatingSystem(new Win7() ); ss.Run (); ss.SetComputerOperatingSystem(new Win8() ); ss.Run (); Console .Read (); } } //电脑的操作系统系统 abstract class OperatingSystem { public abstract void Run(); } //Win7.Win8系统等具体类 //Win7操作系统 class Win7:OperatingSystem { public override void Run() { Console.WriteLine("运行Win7系统"); } } //Win8操作系统 class Win8:OperatingSystem { public override void Run() { Console.WriteLine("运行Win8系统"); } } //电脑品牌类 //电脑品牌 abstract class ComputerBrand { protected OperatingSystem OperatingSystem; //设置电脑系统 public void SetComputerOperatingSystem (OperatingSystem OperatingSystem) { this.OperatingSystem = OperatingSystem; } //运行 public abstract void Run(); } //惠普和联想具体类 //惠普 class ComputerBrandH:ComputerBrand { public override void Run() { OperatingSystem.Run(); } } //联想 class ComputerBrandL:ComputerBrand { public override void Run() { OperatingSystem.Run(); } } } </span>
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这个时候桥接模式就应用而生。牛郎织女通过鹊桥幸福牵手,而我们的桥接模式也在她的一方土地,起着她独特的作用......