1. 程式人生 > >設計模式(C#)——橋接模式

設計模式(C#)——橋接模式

推薦閱讀:

      在早先,幾乎每個手機的充電器介面都是不同的。每個型號的手機都有一個充電器,此時我們把充電器作為一個抽象類,抽象類中提供充電器的所有實現,其他具體手機品牌的充電器都繼承這個抽象類。這樣的實現使得每部不同型號的手機都由自己充電器實現,這樣的設計對於手機的改變可以很好地應對,只需要新增一個派生類(充電器)就搞定了,但隨著時間的推移,為了方便統一,研究者希望每種牌子的手機充電器能統一。這就是我們今天要介紹的橋接模式。

橋接模式

      橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。這種模式涉及到一個作為橋接的介面,使得實體類的功能獨立於介面實現類。這兩種型別的類可被結構化改變而互不影響。

橋接模式要素:

(1)抽象化角色:使用實現者角色提供的介面來定義基本功能介面,持有實現者角色,並在功能介面中委託給它,起到搭建橋樑的作用;。(注意,抽象化角色並不是指它就是一個抽象類,而是指抽象了實現。)
(2)改善後的抽象化角色:作為抽象化角色的子類,增加新的功能,也就是增加新的介面(方法);與其構成類的功能層次結構;
(3)實現者角色:提供了用於抽象化角色的介面;它是一個抽象類或者介面。
(4)具體的實現者角色:作為實現者角色的子類,通過實現具體方法來實現介面;與其構成類的實現層次結構。

      下面針對上面的手機充電器例子,使用程式碼來幫助大家理解橋接模式:
名稱空間橋接模式,包含抽象化角色,改善後的抽象化角色,實現者角色,具體的實現者角色
1.建立抽象化角色Charger

 	/// <summary>
    /// 抽象概念中的充電器,扮演抽象化角色
    /// </summary>
    public class Charger
    {
        // 欄位
        private Phone implementor;

        // 屬性
        public Phone Implementor
        {
            get { return implementor; }
            set { implementor = value; }
        }

        /// <summary>
        /// 電壓,這裡抽象類中不再提供實現了,而是呼叫實現類中的實現
        /// </summary>
        public virtual void Voltage()
        {
            implementor.Voltage();
        }

        /// <summary>
        /// 介面形狀
        /// </summary>
        public virtual void Shape()
        {
            implementor.Shape();
        }
    }

2.改善後的抽象化角色

	/// <summary>
    /// 具體充電器
    /// </summary>
    public class ConcreteCharger : Charger
    {
        public override void Voltage()
        {
            Console.WriteLine("---------------------");
            base.Voltage();
        }
    }

3.實現者角色

	/// <summary>
    /// 手機,提供抽象方法
    /// </summary>
    public abstract class Phone
    {
        public abstract void Voltage();
        public abstract void Shape();
    }

4具體的實現者角色

	// <summary>
    /// 小米手機,重寫基類的抽象方法
    /// 提供具體的實現
    /// </summary>
    public class XiaoMi : Phone
    {
        public override void Voltage()
        {
            Console.WriteLine("小米牌手機充電器電壓");
        }

        public override void Shape()
        {
            Console.WriteLine("小米牌手機充電器介面形狀");
        }
    }

    /// <summary>
    /// 華為手機,重寫基類的抽象方法
    /// </summary>
    public class HuaWei :Phone
    {
        public override void Voltage()
        {
            Console.WriteLine("華為牌手機充電器電壓");
        }

        public override void Shape()
        {
            Console.WriteLine("華為牌手機充電器介面形狀");
        }
    }

5.使用橋接模式

	/// <summary>
    /// 以電視機遙控器的例子來演示橋接模式
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            // 建立一個充電器
            Charger charger = new Charger();
            // 小米手機
            charger .Implementor = new XiaoMi();
            charger .Voltage();
            charger .Shape();
            Console.WriteLine();

            // 華為手機
            charger .Implementor = new HuaWei();
            charger .Voltage();
            charger .Shape();
            Console.Read();
        }
    }

      上面橋接模式的實現中,充電器的功能實現方法不在充電器抽象類中去實現,而是把實現部分用另一個手機類去封裝它,然而充電器中只包含手機類的一個引用,同時這樣的設計也非常符合現實生活中的情況。通過橋接模式,我們把抽象化和實現化部分分離開了,這樣就可以很好應對這兩方面的變化了。