橋接模式(Bridge Pattern):將抽象部分與它的實現部分分離,使它們均可以獨立地變化。它是一種對象結構型模式,又稱爲柄體(Handle and Body)模式或接口(Interface)模式。git
Implementor類:github
namespace BridgePattern.BasicStructure { abstract class Implementor { public abstract void Operation(); } }
ConcreteImplementorA類:編程
namespace BridgePattern.BasicStructure { class ConcreteImplementorA : Implementor { public override void Operation() { Console.WriteLine("具體實現A的方法執行"); } } }
ConcreteImplementorB類:ide
namespace BridgePattern.BasicStructure { class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("具體實現B的方法執行"); } } }
Abstraction類:this
namespace BridgePattern.BasicStructure { abstract class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } }
RefinedAbstraction類:spa
namespace BridgePattern.BasicStructure { class RefinedAbstraction : Abstraction { public override void Operation() { implementor.Operation(); } } }
客戶端調用代碼:設計
static void Main(string[] args) { try { {//BasicStructure Abstraction abstraction = new RefinedAbstraction(); abstraction.SetImplementor(new ConcreteImplementorA()); abstraction.Operation(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:3d
場景模擬:現有多種手機品牌,每種手機品牌的手機又都有某一些軟件,好比:遊戲軟件,通信錄,相機,聽歌......code
好比咱們有M和N兩種手機品牌,M手機和N手機都有X和Y兩種軟件。對象
咱們能夠這樣設計:
咱們還能夠這樣設計:
以上兩種方案均可以實現,但咱們仔細分析下,若是咱們再添加一個手機品牌呢和再添加一個軟件呢?
若是是第一個方案設計的話,再添加一個軟件的話,勢必會修改原來的代碼。
若是是第二個方案設計的話,再添加一個手機品牌的話,也會修改原來的代碼。
並且無論哪一種方案,當擴展一個新的品牌或軟件時,新增的類也很是的多,當時間愈來愈久,軟件和品牌愈來愈多時,你會發現你會崩潰的。
咱們用M表明手機品牌,用N表明軟件,這時候類的遞增規律是呈(M*N+M)或(M*N+N)遞增的。
接下來咱們就用橋接模式使得它呈M+N模式遞增
HandsetSoft(手機軟件)類——Implementor類
namespace BridgePattern.SituationSimulation { /// <summary> /// 手機軟件抽象類 /// </summary> abstract class HandsetSoft { public abstract void Run(string name); } }
HandsetGame(手機遊戲)類——ConcreteImplementorA類
namespace BridgePattern.SituationSimulation { /// <summary> /// 手機遊戲類 /// </summary> class HandsetGame : HandsetSoft { public override void Run(string name) { Console.WriteLine($"{name}手機正在運行手機遊戲"); } } }
HandsetAddressList(手機通信錄)類——ConcreteImplementorB類
namespace BridgePattern.SituationSimulation { /// <summary> /// 手機通信錄類 /// </summary> class HandsetAddressList : HandsetSoft { public override void Run(string name) { Console.WriteLine($"{name}手機正在運行手機通信錄"); } } }
HandsetBrand(手機品牌)類——Abstraction類
namespace BridgePattern.SituationSimulation { /// <summary> /// 手機品牌類抽象類 /// </summary> abstract class HandsetBrand { protected HandsetSoft handsetSoft; public void SetHandsetBrand(HandsetSoft handsetSoft) { this.handsetSoft = handsetSoft; } public virtual void Run(string name) { handsetSoft.Run(name); } } }
Huawei(華爲)類——RefinedAbstraction類
namespace BridgePattern.SituationSimulation { /// <summary> /// 華爲手機 /// </summary> class Huawei : HandsetBrand { public override void Run(string name) { handsetSoft.Run(name); } } }
Xiaomi(小米)類——RefinedAbstraction類
namespace BridgePattern.SituationSimulation { /// <summary> /// 小米手機 /// </summary> class Xiaomi : HandsetBrand { public override void Run(string name) { handsetSoft.Run(name); } } }
客戶端調用代碼:
static void Main(string[] args) { try { {//SituationSimulation HandsetBrand huawei = new Huawei(); huawei.SetHandsetBrand(new HandsetGame()); huawei.Run("華爲"); HandsetBrand xiaomi = new Xiaomi(); xiaomi.SetHandsetBrand(new HandsetGame()); xiaomi.Run("小米"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:
這樣就能夠實現(M+N)類遞增模式了,還很好的知足了"開閉原則"。
在如下狀況下可使用橋接模式: