C#設計模式-3結構型模式-3.2橋接模式(Bridge Pattern)
阿新 • • 發佈:2022-02-19
3.2.1 定義
將抽象部分與它的實現部分分離,使它們都可以獨立地變化
3.2.2 場景模擬
以電視遙控器的一個例子來引出橋接模式解決的問題,遙控器有開電視,關電視,以及更換節目的功能,電視機有多個品牌
3.2.3 場景程式碼實現
抽象類TV封裝了遙控器功能的變化,具體實現交給具體型號電視機去完成:
/// <summary> /// 電視機,提供抽象方法 /// </summary> public abstract class TV { public abstract void TurnOn(); public abstractvoid TurnOff(); public abstract void ChangeChannel(); } /// <summary> /// 長虹牌電視機,重寫基類的抽象方法 /// 提供具體的實現 /// </summary> public class ChangHongTV : TV { public override void TurnOn() { Console.WriteLine("長虹電視打開了"); } publicoverride void TurnOff() { Console.WriteLine("長虹電視關閉了"); } public override void ChangeChannel() { Console.WriteLine("長虹電視換節目"); } } /// <summary> /// 熊貓牌電視機,重寫基類的抽象方法 /// 提供具體的實現 /// </summary> public class PandaTV : TV {public override void TurnOn() { Console.WriteLine("熊貓電視打開了"); } public override void TurnOff() { Console.WriteLine("熊貓電視關閉了"); } public override void ChangeChannel() { Console.WriteLine("熊貓電視換節目"); } }
抽象化部分的程式碼:
/// <summary> /// 抽象概念中的遙控器,扮演抽象化角色 /// </summary> public class RemoteControl { public TV Implementor { get; set; } public virtual void TurnOn() { Implementor.TurnOn(); } public virtual void TurnOff() { Implementor.TurnOff(); } public virtual void ChangeChannel() { Implementor.ChangeChannel(); } } /// <summary> /// 具體遙控器 /// </summary> public class ConcreteRemote : RemoteControl { public override void ChangeChannel() { Console.WriteLine("-------------------"); base.ChangeChannel(); Console.WriteLine("-------------------"); } }
客戶端呼叫:
class Program { static void Main(string[] args) { // 建立一個遙控器 RemoteControl remoteControl = new ConcreteRemote(); // 長虹電視機 remoteControl.Implementor = new ChangHongTV(); remoteControl.TurnOn(); remoteControl.ChangeChannel(); remoteControl.TurnOff(); Console.WriteLine(); // 熊貓牌電視機 remoteControl.Implementor = new PandaTV(); remoteControl.TurnOn(); remoteControl.ChangeChannel(); remoteControl.TurnOff(); Console.Read(); } }
3.2.4 橋接模式的結構圖
3.2.5 橋接模式的基本程式碼
Implementor類:
public abstract class Implementor { public abstract void Operation(); } public class ConcreteImplementorA : Implementor { public override void Operation() { Console.WriteLine("具體實現A的方法執行"); } } public class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("具體實現B的方法執行"); } }
Abstraction類:
public class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } public class RefindedAbstraction : Abstraction { public override void Operation() { implementor.Operation(); } }
客戶端呼叫:
class Program { static void Main(string[] args) { Abstraction ab = new RefindedAbstraction(); ab.SetImplementor(new ConcreteImplementorA()); ab.Operation(); ab.SetImplementor(new ConcreteImplementorB()); ab.Operation(); Console.Read(); } }
3.2.6 優缺點
優點:
把抽象介面與其實現解耦。
抽象和實現可以獨立擴充套件,不會影響到對方。
實現細節對客戶透明,對用於隱藏了具體實現細節。
缺點: 增加了系統的複雜度
3.2.7 使用場景
如果一個系統需要在構件的抽象化角色和具體化角色之間新增更多的靈活性,避免在兩個層次之間建立靜態的聯絡。
設計要求實現化角色的任何改變不應當影響客戶端,或者實現化角色的改變對客戶端是完全透明的。
需要跨越多個平臺的圖形和視窗系統上。
一個類存在兩個獨立變化的維度,且兩個維度都需要進行擴充套件。