設計模式學習筆記-橋接模式


1. 概述

  將抽象部分(Abstraction)與實現部分(Implementor)分離,使它們可以獨立地變化。

2. 解決的問題  

  在軟件系統中,有些類型由於自身的邏輯,它具有兩個或多個維度的變化。為了解決這種多維度變化,又不引入復雜度,這就要使用Bridge模式。

3. 模式中的角色

  2.1 抽象(Abstraction):定義抽象接口,該接口中包含實現具體行為、具體特征的Implementor接口。

  2.2 提煉的抽象(RefinedAbstraction):繼承自Abstraction的子類,依舊是一個抽象的事物名。

  2.3 實現(Implementor):定義具體行為,具體特征的應用接口。

  2.4 具體實現(ConcreteImplementor):實現Implementor。

4. 模式解讀

  4.1 實現要點

    Bridge模式使用“對象間的組合/聚合關系”解耦了抽象和實現之間固有的綁定關系,使得抽象和實現可以沿着各自的維度來變化

  4.2 橋接模式的類圖  

  

  4.3 橋接模式的實現代碼

    /// <summary>
    /// 實現
    /// </summary>
    public abstract class Implementor
    {
        public abstract void Opration();
    }

    public class ConcreteImplementorA : Implementor
    {
        public override void Opration()
        {
            Console.WriteLine("具體實現A的方法執行。");
        }
    }

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

    /// <summary>
    /// 抽象
    /// </summary>
    public abstract class Abstraction
    {
        protected Implementor implementor;

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

        public abstract void Opration();
    }

    /// <summary>
    /// 被提煉的抽象
    /// </summary>
    public class RefinedAbstraction : Abstraction
    {
        public override void Opration()
        {
            implementor.Opration();
        }
    }

  4.4 客戶端的調用

    class Program
    {
        static void Main(string[] args)
        {
            Abstraction abstraction = new RefinedAbstraction();

            abstraction.SetImplementor(new ConcreteImplementorA());
            abstraction.Opration();

            abstraction.SetImplementor(new ConcreteImplementorB());
            abstraction.Opration();

            Console.Read();
        }

    }

  輸出結果:

  具體實現A的方法執行。
  具體實現B的方法執行。

5. 橋接模式是個比較復雜的模式,在對它總結之前,先看一個大家都非常熟悉的應用:三層架構  

  

  解讀:三層架構中的業務邏輯層(LogicalTierInterface)橋接到了數據訪問層(DatabaseTierInterface),大家可以比較一下這個圖和上面橋接模式的圖是多么的一致。大家往往會在數據庫訪問這端做擴展,比如現在增加對MySql的支持;往往只對業務邏輯層的實現(LogicalImplement)做一些內部修改,而不是擴展一個新的實現。如果你的應用確實需要對業務邏輯層做一個擴展(比如NewLogicalImplement),那么這個三層架構對橋接模式的應用就算是比較完整的了。

6. 模式總結

  6.1 優點

    6.1.1 降低了沿着兩個或多個維度擴展時的復雜度,防止類的過度膨脹。

    6.1.2 解除了兩個或多個維度之間的耦合,使它們沿着各自方向變化而不互相影響

  6.2 缺點

    還未發現

  6.3 適用場景

    6.3.1 當一個對象有多個變化因素時,可以考慮使用橋接模式,通過抽象這些變化因素,將依賴具體實現修改為依賴抽象。

    6.3.2 當我們期望一個對象的多個變化因素可以動態變化,而且不影響客戶端的程序使用時。

    6.3.3 如果使用繼承的實現方案,會導致產生很多子類,任何一個變化因素都需要產生多個類來完成,就要考慮橋接模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM