定義:ide
橋接模式:將抽象部分與它的實現部分分離,使它們均可以獨立地變化。學習
解釋:抽象與它的實現分離並非說讓抽象類與其派生類分離,而是抽象類和它的派生類用來實現本身的對象。this
UML類圖和基本代碼:spa
class Program { static void Main(string[] args) { Abstration ab = new RefinedAbstration(); ab.SetImplementor (new ConcreteImplementorA ()); ab.Operation(); ab.SetImplementor(new ConcreteImplementorB()); ab.Operation(); Console.Read(); } } abstract class Implementor { public abstract void Operation(); } class ConcreteImplementorA : Implementor { public override void Operation() { Console.WriteLine("implement A action"); } } class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("implement B action"); } } class Abstration { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } class RefinedAbstration : Abstration { public override void Operation() { implementor.Operation(); } }
在網上看到一個實例,感受很是貼切,」拿來主義「參考學習。code
具體是:現實生活中實現遙控器,遙控器中並不包含開機、關機、換臺等功能的實現,遙控器只是包含了電視機上的這些功能的引用,而後紅外線去找到電視機上對應功能的實現。對象
抽象類電視機及生成長虹、三星電視機:blog
public abstract class TV { public abstract void On(); public abstract void Off(); public abstract void TurnChannel(); } public class ChangHong : TV { public override void On() { Console.WriteLine("長虹牌電視機已經打開了"); } public override void Off() { Console.WriteLine("長虹牌電視機已經關掉了"); } public override void TurnChannel() { Console.WriteLine("長虹牌電視機換頻道"); } } public class Samsung : TV { public override void On() { Console.WriteLine("三星牌電視機已經打開了"); } public override void Off() { Console.WriteLine("三星牌電視機已經關掉了"); } public override void TurnChannel() { Console.WriteLine("三星牌電視機換頻道"); } }
抽象類遙控器及實現:接口
public class RemoteControl { private TV implementor; public TV Implementor { get { return implementor; } set { implementor = value; } } public virtual void On() { implementor.On(); } public virtual void Off() { implementor.Off(); } public virtual void TurnChannel() { implementor.TurnChannel(); } } public class ConcreteRemote : RemoteControl { }
客戶端調用:rem
RemoteControl remoteControl = new ConcreteRemote(); remoteControl.Implementor = new ChangHong(); remoteControl.On(); remoteControl.Off(); remoteControl.TurnChannel();
優勢:get
抽象接口與實現解耦。
抽象和實現均可以獨立擴展,不會影響到對方。
缺點:
增長了系統的複雜度。
適用場景:
一個類存在兩個獨立變化的維度,且兩個維度都須要進行擴展。
須要跨越多個平臺的圖形和窗口系統。