1. 程式人生 > >C#設計模式07-橋接模式

C#設計模式07-橋接模式

橋接模式,從字面意思上說就是用一條橋樑來連結兩個不同的事物。專業一點講,就是當一個類存在獨立變化的兩個維度的時候,可以將這兩個維度分離出,設計成獨立的繼承結構,使他們可以獨立擴充套件。橋接模式用一種巧妙的方式(用抽象關聯代替傳統的多重繼承)解決了多重繼承存在的問題。

假如說現在要開發一個影象瀏覽系統,要求可以顯示JPG,PNG,GIF等格式的影象,同時系統要跨平臺,要求能在Windows,Unix,Linux等作業系統下面展示,不同的作業系統可以把不同的圖片轉換成畫素矩陣,然後在系統中顯示,這個時候我們可以理解成瀏覽系統(類)裡面有兩個獨立變換的維度,一個是影象格式,一個作業系統,他們都可以獨立擴充套件。這個時候為了保證系統的擴充套件性和靈活性,就可以採用橋接模式來連線這兩個獨立變化的維度。如果把這兩個維度寫在一起,用傳統的繼承方式解決的話,系統的擴充套件性會很差。

接下來看看系統的類圖吧

我們給不同格式的圖片抽象了一個父類,給不同的作業系統抽象了一個父類,客戶端針對Image程式設計,一般情況下Image類是抽象類。然後看一下具體的程式碼吧

顯示Image類和它的子類的程式碼

    abstract class Image//客戶端針對它程式設計
    {
        protected ImageImp imp;
        public void SetImage(ImageImp imp)
        {
            this.imp = imp;
        }
        public abstract void ShowImage();
    }

    class GIFImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//呼叫不同的作業系統的中函式來繪製畫素矩陣
            Console.WriteLine("畫素矩陣繪製完畢了,格式為GIF");
        }
    }
    class BMPImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//呼叫不同的作業系統的中函式來繪製畫素矩陣
            Console.WriteLine("畫素矩陣繪製完畢了,格式為BMP");
        }
    }
    class JPGImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//呼叫不同的作業系統的中函式來繪製畫素矩陣
            Console.WriteLine("畫素矩陣繪製完畢了,格式為JPG");
        }
    }
    class PNGImage:Image
    {
        public override void ShowImage()
        {
            imp.DoPaint();//呼叫不同的作業系統的中函式來繪製畫素矩陣
            Console.WriteLine("畫素矩陣繪製完畢了,格式為BMP");
        }
    }
然後是作業系統的父類和不同的作業系統
    interface ImageImp
    {
        void DoPaint();
    }
    class WindowsImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在windows作業系統中顯示影象啦!");
        }
    }
    class UnixImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在Unix作業系統中顯示影象啦!");
        }
    }
    class LinuxImp:ImageImp
    {
        public void DoPaint()
        {
            Console.WriteLine("在Linux作業系統中顯示影象啦!");
        }
    }
最後使我們的客戶端程式碼,客戶端通過反射動態載入影象類和作業系統類,並以介面或者抽象類的方式返回。
    class Program
    {
        static void Main(string[] args)
        {
            Image img;
            ImageImp imp;
            string imageType = ConfigurationManager.AppSettings["imageName"];
            string osType = ConfigurationManager.AppSettings["osName"];
            img = Assembly.Load("橋接模式").CreateInstance(imageType) as Image;
            imp = Assembly.Load("橋接模式").CreateInstance(osType) as ImageImp;
            img.SetImage(imp);
            img.ShowImage();
            Console.ReadLine();
        }
    }
來看看執行結果吧


在Image子類中,我們設定了作業系統為Linux系統,然後呼叫Linux的DoPaint方法繪製畫素矩陣,最後在系統中顯示,但讓我們只是簡單模擬了一下。這樣的話,通過在Image類中保留一個ImageImp類的引用(也即是抽象關聯)來使這兩個獨立變化的維度產生聯絡,並且可以獨立擴充套件。

橋接模式就介紹到這裡了。橋接模式的適用場景就是當系統中存在兩個獨立變化的維度,並且要求我們獨立對他們進行擴充套件而相互之間不受影響。並且它將方法的實現延遲到子類中去。但橋接模式的使用要求我們必須準確的識別出這兩個獨立變化的維度,這是非常困難的,並且需要有一定的經驗積累。

本博文參考了C#設計模式這本書寫的,在此表示感謝!

接下來會給大家介紹組合模式,敬請期待!