橋接模式是一種結構型設計模式,它將抽象和實現分離,使它們可以獨立地變化。橋接模式透過將實現細節從抽象中分離出來,使得抽象和實現可以獨立地進行擴充套件和修改。
橋接模式有四個主要角色:
-
抽象類(Abstraction):定義了抽象類的介面,幷包含一個對實現類的引用。
-
實現類介面(Implementor):定義了實現類的介面,具體實現留給具體的實現類。
-
具體實現類(Concrete Implementor):實現實現類介面,並提供具體的實現邏輯。
-
修正抽象類(Refined Abstraction):擴充套件抽象類,提供更多特定功能的方法。
橋接模式的工作原理如下:
-
抽象類包含一個對實現類介面的引用,透過該引用呼叫實現類的方法。
-
實現類介面定義了具體實現類的方法。
-
具體實現類實現實現類介面,並提供具體的實現邏輯。
-
修正抽象類擴充套件了抽象類,可以提供更多特定功能的方法。
橋接模式的優點包括:
-
可以將抽象和實現解耦,使它們可以獨立地進行變化。
-
可以提高系統的可擴充套件性,可以方便地新增新的抽象類和實現類。
-
可以在執行時動態地將抽象和實現進行組合。
橋接模式適用於以下場景:
-
當需要在抽象和實現之間存在多對多的關係時,可以使用橋接模式。
-
當需要將抽象和實現分離,使它們可以獨立地進行變化時,可以使用橋接模式。
總結而言,橋接模式透過將抽象和實現分離,使它們可以獨立地進行變化。它提供了一種解決抽象和實現之間耦合關係的方式,提高了系統的可擴充套件性和靈活性。
以一杯咖啡為例,以容量為中杯和大杯,以口味分為原味,加奶,加糖。
實際上最終顧客可以買到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(); }