這是一個很美麗的,千古流傳的愛情故事,每到農歷七月初七,相傳牛郎織女鵲橋相會的日子,牛郎和織女被銀河隔開,只允許每年的農歷七月七日相見。為了讓牛郎和織女能順利相會。各地的喜鵲就會飛過來用大家的身體緊貼著搭成一座橋,此橋就叫做鵲橋。牛郎和織女便在這鵲橋上相會。我就會抬頭仰望星空,尋找銀河兩邊的牛郎星和織女星,希望能看到他們一年一度的相會......
在牛郎織女相會的過程中,喜鵲是功不可沒的大臣,我們今天的設計模式就從鵲橋開始說起---橋接模式,顧名思義,在接口與實現之間,架設一座橋梁,這座橋,其實并非是為了過河,也不是為了讓牛郎織女相會,那是人家喜鵲的事兒,咱要符合單一職責原則,干好自己的事兒,那就是將抽象部分與她的實現部分分離,使她都可以獨立地變化。首先來看一下我們橋接模式的結構圖:
??
?為了更好的理解橋接模式,我們再來舉一個例子,走進南四樓的機房,你除了看到一個個認真敲代碼的孩子之外,還會看到大家使用的電腦,有惠普,聯想,操作系統有Win7、Win8,由此我們可以畫一個類圖,如下所示:
??
全國人民都知道,電腦的品牌除了惠普和聯想,還有戴爾、宏碁、華碩等;操作系統除了Win7和Win8之外,還有XP、Linux,如此一來,上面的結構圖,似乎美中有著不足,改善一下我們的類圖,如下:
? ??
我們來分析一下上面的兩張圖,可以發現一個是用繼承完成的,一種是用組合/聚合的方式完成的,而采用組合/聚合的方式就是所謂的抽象與實現分離。實際上在設計類時,我們應該首先考慮的是組合/聚合的方式,而不是考慮繼承的方式,因為繼承是一種強耦合關系,使用繼承使得子類過多的依靠父類,接著,我們來看一下代碼實現:
~~~
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();??
????????}??
????}??
??
}??
~~~
在軟件系統中,某些類型由于自身的邏輯,它具有兩個或多個維度的變化,那么如何應對這種“多維度的變化”?如何利用面向對象的技術來使得該類型能夠輕松的沿著多個方向進行變化,而又不引入額外的復雜度?這個時候橋接模式就應用而生。牛郎織女通過鵲橋幸福牽手,而我們的橋接模式也在她的一方土地,起著她獨特的作用......