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

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

clas 有一個 == air RR 然而 復雜度 靈活 兩個

一、橋接模式介紹:

橋接模式即將抽象部分與實現部分脫耦,實現抽象化與實現化的解耦,使它們相互獨立互不影響到對方,使它們可以獨立變化。

二、使用場景:

  1. 如果一個系統需要在構件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個層次之間建立靜態的聯系。
  2. 設計要求實現化角色的任何改變不應當影響客戶端,或者實現化角色的改變對客戶端是完全透明的。
  3. 需要跨越多個平臺的圖形和窗口系統上。
  4. 一個類存在兩個獨立變化的維度,且兩個維度都需要進行擴展。

三、情景例子:

我們每個品牌的空調都有一個自己的遙控器,我們如果把遙控器做為一個抽象類,抽象類中提供遙控器的所有實現,其他具體空調品牌的遙控器都繼承這個抽象類,這樣的實現使得每部不同型號的空調都有自己遙控器實現。這樣的設計對於空調型號的改變可以很好地應對,只需要添加一個子類就行了,但用戶如果需要改變遙控器的功能,此時就需要修改遙控器抽象類的提供的接口了,此時可能只需要向抽象類中添加一個方法就可以解決了,但是這樣帶來的問題是我們改變了抽象的實現,如果用戶需要同時改變空調型號和遙控器功能時,就會導致相當大的修改,顯然這樣的設計並不好,然而使用橋接模式可以很好地解決這個問題。

四、具體代碼:

實現化部分代碼:

1、創建空調抽象類,提供抽象行為方法:

    /// <summary>
    /// 抽象空調類,提供抽象方法
    /// </summary>
    public abstract class AirConditioner
    {
        public abstract void On();
        public abstract void Off();
        public abstract void TransitionMode();
    }

2、創建具體空調實現類,實現具體方法:

    /// <summary>
/// 格力空調類,提供具體實現 /// </summary> public class Gree : AirConditioner { public override void Off() { Console.WriteLine("打開格力空調"); } public override void On() { Console.WriteLine("關閉格力空調"); } public override
void TransitionMode() { Console.WriteLine("格力空調切換模式"); } }
    /// <summary>
    /// 美的空調,提供具體實現
    /// </summary>
    public class Midea : AirConditioner
    {
        public override void Off()
        {
            Console.WriteLine("打開美的空調");
        }

        public override void On()
        {
            Console.WriteLine("關閉美的空調");
        }

        public override void TransitionMode()
        {
            Console.WriteLine("美的空調切換模式");
        }
    }

抽象化部分代碼:

1、創建抽象遙控器,扮演抽象化角色,但不提供實現,而是調用實現類中的實現:

    public class RemoteControl
    {
        private AirConditioner specific_implementation;
        public AirConditioner Specific_Implementation { get { return specific_implementation; } set { specific_implementation = value; } }

        /// <summary>
        /// 開空調
        /// </summary>
        public virtual void On()
        {
            specific_implementation.On();
        }

        /// <summary>
        /// 關空調
        /// </summary>
        public virtual void Off()
        {
            specific_implementation.Off();
        }

        /// <summary>
        /// 換模式
        /// </summary>
        public virtual void SetMode()
        {
            specific_implementation.TransitionMode();
        }
    }

2、創建具體遙控器:

    /// <summary>
    /// 具體遙控器
    /// </summary>
    public class ConcreteRemoteControl:RemoteControl
    {
        public override void SetMode()
        {
            base.SetMode();
            Console.WriteLine("========================");
        }
    }

3、調用

        static void Main(string[] args)
        {
            //創建一個遙控器對象
            RemoteControl remotecontrol = new ConcreteRemoteControl();

            //格力空調
            remotecontrol.Specific_Implementation = new Gree();
            remotecontrol.On();
            remotecontrol.Off();
            remotecontrol.SetMode();

            //美的空調
            remotecontrol.Specific_Implementation = new Midea();
            remotecontrol.On();
            remotecontrol.Off();
            remotecontrol.SetMode();

            Console.ReadKey();
        }

五、總結:

優點:

  • 把抽象接口與其實現解耦。
  • 抽象和實現可以獨立擴展,不會影響到對方。
  • 實現細節對客戶透明,對用於隱藏了具體實現細節。

缺點:

  • 增加了系統的復雜度

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