標籤:style blog http color 使用 io 2014 art
這是一個非常漂亮的,千古流傳的愛情故事,每到農曆七月初七,相傳牛郎織女Queqiao相會的日子,牛郎和織女被銀河隔開,僅僅同意每年的農曆七月七日相見。為了讓牛郎和織女能順利相會。各地的喜鵲就會飛過來用大家的身體緊貼著搭成一座橋,此橋就叫做Queqiao。牛郎和織女便在這Queqiao上相會。我就會抬頭仰望星空,尋找銀河兩邊的牛郎星和織女星,希望能看到他們一年一度的相會...... 在牛郎織女相會的過程中,喜鵲是功不可沒的大臣,我們今天的設計模式就從Queqiao開始說起---橋接模式,顧名思義,在介面與實現之間,架設一座橋樑,這座橋,事實上並不是是為了過河,也不是為了讓牛郎織女相會,那是人家喜鵲的事兒,咱要符合單一職責原則,幹好自己的事兒,那就是將抽象部分與她的實現部分分離,使她都能夠獨立地變化。首先來看一下我們橋接模式的結構圖:
為了更好的理解橋接模式,我們再來舉一個範例,走進南四樓的機房,你除了看到一個個認真寫程式的孩子之外,還會看到大家使用的電腦,有惠普,聯想,作業系統有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> 在軟體系統中,某些類型因為自身的邏輯,它具有兩個或多個維度變化,那麼怎樣應對這樣的“多維度變化”?怎樣利用物件導向的技術來使得該類型可以輕鬆的沿著多個方向進行變化,而又不引入額外的複雜度?這個時候橋接模式就應用而生。牛郎織女通過Queqiao幸福牽手,而我們的橋接模式也在她的一方土地,起著她獨特的作用......