設計模式-橋接模式(Bridge Pattern)

來源:互聯網
上載者:User

  1.概述
    橋接模式(Bridge),將抽象部分與它的實現部分分離,是他們都可以獨立的變化。
什麼叫抽象與它的實現分離,這並不是說,讓抽象類別與其他衍生類別分離,因為這沒有任何意義。實現指的是抽象類別和它的衍生類別用來實現自己的對象。
    下面我們看橋接模式的結構圖:

    (1).Abstraction:定義抽象類別的介面並維護指向Implementor類的對象指標。
    (2).RefinedAbstraction:擴充Abstraction定義的介面。
    (3).Implementor:定義實作類別的介面,該介面不一定要與Abstraction的介面完全一致。事實上這兩個介面可以完全不同。一般而言,Implementor介面僅提供基本操作,而Abstraction則定義基於這些基本操作的較高層次的操作。
    (4).ConcreteImplementor:實現Implementor介面並定義它的具體實現。
    橋接模式基本代碼如下:
    Implementor類:
    public abstract class Implementor
    {
        public abstract void Operation();
    }

ConcreteImplementor等衍生類別:
    public class ConcreteImplementorA : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("具體實現A的方法執行");
        }
    }

    public class ConcreteImplementorB : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("具體實現B的方法執行");
        }
    }

    Abstraction類:
    public class Abstraction
    {
        protected Implementor implementor;

        public void SetImplementor(Implementor implementor)
        {
            this.implementor = implementor;
        }

        public virtual void Operation()
        {
            implementor.Operation();
        }

    }

    RefinedAbstraction類:
    public class RefinedAbstraction : Abstraction
    {
        public override void Operation()
        {
            implementor.Operation();
        }
    }

    2.執行個體
    為了跟深入的瞭解橋接模式(Bridge),我們來看大話設計模式中手機軟體的演變過程。 先來看看小菜的第一版代碼,結構如下:

    詳細代碼如下:


    //手機品牌
    public class HandsetBrand
    {
        public virtual void Run()
        {
        }
    }
    //手機品牌M
    public class HandsetBrandM : HandsetBrand
    {

    }
    //手機品牌N
    public class HandsetBrandN : HandsetBrand
    {

    }
    //手機品牌M的遊戲
    public class HandsetBrandMGame : HandsetBrandM
    {
        public override void Run()
        {
            Console.WriteLine("運行M品牌手機遊戲");
        }
    }
    //手機品牌N的遊戲
    public class HandsetBrandNGame : HandsetBrandN
    {
        public override void Run()
        {
            Console.WriteLine("運行N品牌手機遊戲");
        }
    }
    //手機品牌M的通訊錄
    public class HandsetBrandMAddressList : HandsetBrandM
    {
        public override void Run()
        {
            Console.WriteLine("運行M品牌手機通訊錄");
        }
    }
    //手機品牌N的通訊錄
    public class HandsetBrandNAddressList : HandsetBrandN
    {
        public override void Run()
        {
            Console.WriteLine("運行N品牌手機通訊錄");
        }
    }

    調用:
            HandsetBrand ab;
            ab = new HandsetBrandMAddressList();
            ab.Run();

            ab = new HandsetBrandMGame();
            ab.Run();

            ab = new HandsetBrandNAddressList();
            ab.Run();

            ab = new HandsetBrandNGame();
            ab.Run();

            Console.Read();

    下面來小菜的第二方案,結構圖如下:

    代碼如下:
    public class Program
    {
        static void Main(string[] args)
        {
            HandsetSoft ab;
            ab = new HandsetBrandMGame();
            ab.Run();

            ab = new HandsetBrandNGame();
            ab.Run();

            ab = new HandsetBrandMAddressList();
            ab.Run();

            ab = new HandsetBrandNAddressList();
            ab.Run();

            Console.Read();
        }
    }

    //手機軟體
    public class HandsetSoft
    {
        public virtual void Run()
        {
        }
    }
    //通訊錄
    public class HandsetAddressList : HandsetSoft
    {

    }
    //遊戲
    public class HandsetGame : HandsetSoft
    {

    }
    //手機品牌M的遊戲
    public class HandsetBrandMGame : HandsetGame
    {
        public override void Run()
        {
            Console.WriteLine("運行M品牌手機遊戲");
        }
    }
    //手機品牌N的遊戲
    public class HandsetBrandNGame : HandsetGame
    {
        public override void Run()
        {
            Console.WriteLine("運行N品牌手機遊戲");
        }
    }
    //手機品牌M的通訊錄
    public class HandsetBrandMAddressList : HandsetAddressList
    {
        public override void Run()
        {
            Console.WriteLine("運行M品牌手機通訊錄");
        }
    }
    //手機品牌N的通訊錄
    public class HandsetBrandNAddressList : HandsetAddressList
    {
        public override void Run()
        {
            Console.WriteLine("運行N品牌手機通訊錄");
        }
    }

    下面大鳥登台,給出的橋接模式的解決方案,先來結構圖:

    代碼如下:
       static void Main(string[] args)
        {
            HandsetBrand ab;
            ab = new HandsetBrandN();

            ab.SetHandsetSoft(new HandsetGame());
            ab.Run();

            ab.SetHandsetSoft(new HandsetAddressList());
            ab.Run();

            ab = new HandsetBrandM();

            ab.SetHandsetSoft(new HandsetGame());
            ab.Run();

            ab.SetHandsetSoft(new HandsetAddressList());
            ab.Run();

            Console.Read();
        }
    }

    //手機品牌
    public abstract class HandsetBrand
    {
        protected HandsetSoft soft;

        //設定手機軟體
        public void SetHandsetSoft(HandsetSoft soft)
        {
            this.soft = soft;
        }
        //運行
        public abstract void Run();
        

    }

    //手機品牌N
    public class HandsetBrandN : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //手機品牌M
    public class HandsetBrandM : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //手機品牌S
    public class HandsetBrandS : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }


    //手機軟體
    public abstract class HandsetSoft
    {

        public abstract void Run();
    }

    //手機遊戲
    public class HandsetGame : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("運行手機遊戲");
        }
    }

    //手機通訊錄
    public class HandsetAddressList : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("運行手機通訊錄");
        }
    }

    //手機MP3播放
    public class HandsetMP3 : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("運行手機MP3播放");
        }
    }

    3.總結
    效果及實現要點:
    1.Bridge模式使用“對象間的組合關係”解耦了抽象和實現之間固有的綁定關係,使得抽象和實現可以沿著各自的維度來變化。
    2.所謂抽象和實現沿著各自維度變化,即“子類化”它們,得到各個子類之後,便可以任意它們,從而獲得不同平台上的不同型號。
    3.Bridge模式有時候類似於多繼承方案,但是多繼承方案往往違背了類的單一職責原則(即一個類只有一個變化的原因),複用性比較差。Bridge模式是比多繼承方案更好的解決方案。
    4.Bridge模式的應用一般在“兩個非常強的變化維度”,有時候即使有兩個變更維度,但是某個方向的變化維度並不劇烈——換言之兩個變化不會導致縱橫交錯的結果,並不一定要使用Bridge模式。
    何時採用
    在以下的情況下應當使用橋樑模式:
    1.如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態聯絡。 
    2.設計要求實現化角色的任何改變不應當影響用戶端,或者說實現化角色的改變對用戶端是完全透明的。 
    3.一個構件有多於一個的抽象化角色和實現化角色,系統需要它們之間進行動態耦合。 
    4.雖然在系統中使用繼承是沒有問題的,但是由於抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
    
    參考資料:
    1.大話設計模式
    2.http://terrylee.cnblogs.com/archive/2006/02/24/336652.html

轉載自:http://www.cnblogs.com/peida/archive/2008/07/17/1244690.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.