08_橋接模式

野码發表於2024-03-10

橋接模式是一種結構型設計模式,它將抽象和實現分離,使它們可以獨立地變化。橋接模式透過將實現細節從抽象中分離出來,使得抽象和實現可以獨立地進行擴充套件和修改。

橋接模式有四個主要角色:

  1. 抽象類(Abstraction):定義了抽象類的介面,幷包含一個對實現類的引用。

  2. 實現類介面(Implementor):定義了實現類的介面,具體實現留給具體的實現類。

  3. 具體實現類(Concrete Implementor):實現實現類介面,並提供具體的實現邏輯。

  4. 修正抽象類(Refined Abstraction):擴充套件抽象類,提供更多特定功能的方法。

橋接模式的工作原理如下:

  1. 抽象類包含一個對實現類介面的引用,透過該引用呼叫實現類的方法。

  2. 實現類介面定義了具體實現類的方法。

  3. 具體實現類實現實現類介面,並提供具體的實現邏輯。

  4. 修正抽象類擴充套件了抽象類,可以提供更多特定功能的方法。

橋接模式的優點包括:

  1. 可以將抽象和實現解耦,使它們可以獨立地進行變化。

  2. 可以提高系統的可擴充套件性,可以方便地新增新的抽象類和實現類。

  3. 可以在執行時動態地將抽象和實現進行組合。

橋接模式適用於以下場景:

  1. 當需要在抽象和實現之間存在多對多的關係時,可以使用橋接模式。

  2. 當需要將抽象和實現分離,使它們可以獨立地進行變化時,可以使用橋接模式。

總結而言,橋接模式透過將抽象和實現分離,使它們可以獨立地進行變化。它提供了一種解決抽象和實現之間耦合關係的方式,提高了系統的可擴充套件性和靈活性。

以一杯咖啡為例,以容量為中杯和大杯,以口味分為原味,加奶,加糖。
實際上最終顧客可以買到6種咖啡。它們分別是:
中杯原味,中杯加奶,中杯加糖。
大杯原味,大杯加奶,大杯加糖。
中杯、大杯(抽象)
原味,加奶,加糖(行為)

Implementor

/// <summary>
    /// 行為層介面
    /// </summary>
    public abstract  class CoffeeBase
    {
        /// <summary>
        /// 製作咖啡
        /// </summary>
        /// <returns></returns>
        public abstract string Making();
    }

Concrete Implementor

public class MilkCoffee : CoffeeBase
    {
        public override string Making()
        {
            return "牛奶咖啡";
        }
    }
public class OriginalCoffee : CoffeeBase
    {
        public override string Making()
        {
            return "原味咖啡";
        }
    }
public class SugarCoffee : CoffeeBase
    {
        public override string Making()
        {
            return "加糖咖啡";
        }
    }

Abstraction

/// <summary>
    /// 抽象層介面
    /// </summary>
    public abstract  class CupBase 
    {
        private CoffeeBase coffeeBase;

        public CupBase(CoffeeBase coffeeBase)
        {
            this.coffeeBase = coffeeBase;
        }

        public CoffeeBase CoffeeBase()
        {
            return coffeeBase;
        }

        /// <summary>
        /// 這個方法呼叫CoffeeBase裡面的成員
        /// </summary>
        public abstract void Sale();

        public void SetCoffee(CoffeeBase coffeeBase)
        {
            this.coffeeBase=coffeeBase;
        }
    }

實現CupBase

/// <summary>
    /// 中杯咖啡
    /// </summary>
    public class MediumCupCoffee : CupBase
    {
        public MediumCupCoffee(CoffeeBase coffeeBase) : base(coffeeBase)
        {
        }

        public override void Sale()
        {
            string result = $"中杯{this.CoffeeBase().Making()}";
            Console.WriteLine(result);
        }
    }
/// <summary>
    /// 大杯咖啡
    /// </summary>
    public class LargeCupCoffee : CupBase
    {
        public LargeCupCoffee(CoffeeBase coffeeBase) : base(coffeeBase)
        {
        }

        public override void Sale()
        {
            string result = $"大杯{this.CoffeeBase().Making()}";
            Console.WriteLine(result);
        }
    }

Refined Abstraction

public class Cup : CupBase
    {
        public Cup(CoffeeBase coffeeBase) : base(coffeeBase)
        {
        }

        public override void Sale()
        {
            Console.WriteLine("統一正常杯"+CoffeeBase().Making());
        }
    }

呼叫

internal class Client
    {
        public void Start()
        {
            Console.WriteLine("顧客A想買大杯加糖的咖啡");
            var largeCupCoffee = new LargeCupCoffee(new SugarCoffee());
            largeCupCoffee.Sale();

            Console.WriteLine("顧客B想買大杯加奶的咖啡");
            var milkCupCoffee = new LargeCupCoffee(new MilkCoffee());
            milkCupCoffee.Sale();

            Console.WriteLine("顧客C想買大杯原味的咖啡");
            var originaeCupCoffee = new LargeCupCoffee(new OriginalCoffee());
            originaeCupCoffee.Sale();

            Console.WriteLine("---------------------------------------------------");


            CupBase cup = new Cup(null);

            cup.SetCoffee(new SugarCoffee());
            cup.Sale();

            cup.SetCoffee(new MilkCoffee());
            cup.Sale();

            cup.SetCoffee(new OriginalCoffee());
            cup.Sale();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

相關文章