这是一个非常漂亮的,千古流传的爱情故事,每到农历七月初七,相传牛郎织女鹊桥相会的日子,牛郎和织女被银河隔开,仅仅同意每年的农历七月七日相见。为了让牛郎和织女能顺利相会。各地的喜鹊就会飞过来用大家的身体紧贴着搭成一座桥,此桥就叫做鹊桥。牛郎和织女便在这鹊桥上相会。我就会抬头仰望星空,寻找银河两边的牛郎星和织女星,希望能看到他们一年一度的相会......
在牛郎织女相会的过程中,喜鹊是功不可没的大臣,我们今天的设计模式就从鹊桥開始说起---桥接模式,顾名思义,在接口与实现之间,架设一座桥梁,这座桥,事实上并不是是为了过河,也不是为了让牛郎织女相会,那是人家喜鹊的事儿,咱要符合单一职责原则,干好自己的事儿,那就是将抽象部分与她的实现部分分离,使她都能够独立地变化。首先来看一下我们桥接模式的结构图:
为了更好的理解桥接模式,我们再来举一个样例,走进南四楼的机房,你除了看到一个个认真写程序的孩子之外,还会看到大家使用的电脑,有惠普,联想,操作系统有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>在软件系统中,某些类型因为自身的逻辑,它具有两个或多个维度的变化,那么怎样应对这样的“多维度的变化”?怎样利用面向对象的技术来使得该类型可以轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这个时候桥接模式就应用而生。牛郎织女通过鹊桥幸福牵手,而我们的桥接模式也在她的一方土地,起着她独特的作用......