設計模式(十二):橋接模式

K戰神發表於2016-01-14

一、定義

在軟體系統中,某些型別由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種“多維度的變化”?如何利用面嚮物件的技術來使得該型別能夠輕鬆的沿著多個方向進行變化,而又不引入額外的複雜度?這就要使用Bridge模式。

當一個抽象可能有多個實現時,通常用繼承來進行協調。抽象類定義對該抽象的介面,而具體的子類則用不同的方式加以實現。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立地進行修改、擴充和重用。

如果一個抽象類或介面有多個具體實現子類,而這些子類之中有內容或概念上重疊,需要我們把抽象的共同部分各自獨立開來:即原來是準備放在一個介面裡,現在需要設計兩個介面——抽象介面和行為介面。然後再分別針對各自的具體子類定義抽象介面和行為介面的方法和呼叫關係。

將抽象部分與實現部分分離,使它們都可以獨立的變化。

二、例項:

在Windows系統上我們有一個寫入操作,這個寫入操作多重型別(txt\xml)

但是現在功能不僅僅只侷限在Windows平臺上,需要Mac上也要實現。並且還要增加寫入型別(bit流)

抽象系統:

 public abstract class OS
    {
        public abstract void WriteTxt();
        public abstract void WriteXML();
    }

實現:

 public class Mac : OS
    {
        public Mac()
        {
            Console.WriteLine("Mac系統");
        }
        public override void WriteTxt()
        {
            Console.WriteLine("WriteType : Txt");
        }
        public override void WriteXML()
        {
            Console.WriteLine("WriteType : XML");
        }
    }
    public class Win : OS
    {
        public Win()
        {
            Console.WriteLine("Windows 系統");
        }
        public override void WriteTxt()
        {
            Console.WriteLine("WriteType : Txt");
        }
        public override void WriteXML()
        {
            Console.WriteLine("WriteType : XML");
        }
    }

抽象寫入操作:

 public abstract class IOHelp
    {
        public OS os;//搭個橋
        public IOHelp(OS _os)
        {
            os = _os;
        }
        public abstract void Write();
}

實現:

 public class TxtHelp : IOHelp
    {
        public TxtHelp(OS _os):base(_os)
        {
        }      
        public override void Write()
        {
            os.WriteTxt();
        }      
    }
    public class XMLHelp : IOHelp
    {
        public XMLHelp(OS _os) : base(_os)
        {
        }       
        public override void Write()
        {
            os.WriteXML();
        }       
    }

客戶端:

//---------------------橋接模式------------------------
            Bridge.OS mac = new Bridge.Mac();
            Bridge.IOHelp txt = new Bridge.XMLHelp(mac);
            txt.Write();
            Console.ReadKey();

三、總結

老方式:我們抽象寫方式(因為有多種寫型別),後續需要在不同平臺執行不同的寫入方式。

那就到了我們:橋接模式

抽象系統,抽象寫入方式(橋接一下系統),使用系統的具體執行方法。

-----例子也是難想啊····-----

相關文章