橋接模式的定義:
將抽象化(Abstraction)與實作化(Implementation)脫耦,使得二者可以獨立地變化。
橋接模式結構圖:
橋接模式中得角色:
抽象化(Abstraction)角色:抽象化給出的定義,並保存一個對實現化物件的引用。
修正抽象化(Refined Abstraction)角色:擴充抽象化角色,改變並修正父類別對抽象化的定義。
實現化(Implementor)角色:這個角色給出實現化角色的接口,但不給出具體的實現。必須指出的是,這個介面不一定和抽象化角色的介面定義相同, 實際上,這兩個介面可以非常不一樣。實現化角色應只給予底層操作,而抽象化角色應只給予基於底層操作的更高一層的操作。
結合實例說明:
引用一個電視遙控器的例子,對於每一個牌子的遙控器,都有相呼應的遙控器來控制,這時候我們想到的設可能是:抽像一個遙控器接口,裡面有待實現的開機,關機,換頻道這樣一組功能方法。然後創建具體的遙控器類別去繼承這個接口,實現裡面的方法。這樣可以滿足每個電視機都實現了自己的遙控器,對於新增了其他類型的 電視機,只需要添加一個派生類就可以滿足新的遙控器的派生。但是哪一天,用戶要求在遙控器中加入一個返回上一個頻道的功能時候,就需要改變抽像出來的遙控器 接口,需要向抽象類中添加一個新的方法,這樣就改變了抽象類的實現。如果使用者要求同時改變電視機的產品行為,和遙控器的行為方法,對於上面的設計會造成很 大的改變。使用橋接模式可以很好的解決這些問題。
使用:
1.首先抽像出電視機,提供遙控器改變的行為方法。
/// <summary> /// 电视机,提供抽象方法 /// </summary> public abstract class TV { public abstract void On(); public abstract void Off(); public abstract void tuneChannel(); }
2.創建特定的電視機,繼承自抽象電視機類別:
/// <summary> /// 三星牌电视机,重写基类的抽象方法 /// </summary> public class Samsung:TV { public override void On() { Console.WriteLine("三星牌电视机已经打开了"); } public override void Off() { Console.WriteLine("三星牌电视机已经关掉了"); } public override void tuneChannel() { Console.WriteLine("三星牌电视机换频道"); } } /// <summary> /// 长虹牌电视机,重写基类的抽象方法 /// 提供具体的实现 /// </summary> public class ChangHong : TV { public override void On() { Console.WriteLine("长虹牌电视机已经打开了"); } public override void Off() { Console.WriteLine("长虹牌电视机已经关掉了"); } public override void tuneChannel() { Console.WriteLine("长虹牌电视机换频道"); } }
3.然後抽象化概覽中的遙感功能。
/// <summary> /// 抽象概念中的遥控器,扮演抽象化角色 /// </summary> public abstract class RemoteControl { public TV implementor { get; set; } /// <summary> /// 开电视机 /// 这里抽象类中不再提供实现了,而是调用实现类中的实现 /// </summary> public virtual void On() { implementor.On(); } /// <summary> /// 关电视机 /// </summary> public virtual void Off() { implementor.Off(); } /// <summary> /// 换频道 /// </summary> public virtual void SetChannel() { implementor.tuneChannel(); } }
4.創建特定遙控器類別:這裡面,我重寫了更換頻道的方法,其實還可以重寫其他的方法。
/// <summary> /// 具体遥控器类 /// </summary> public class ConcreteRemote:RemoteControl { /// <summary> /// 重写更换频道方法 /// </summary> public override void SetChannel() { Console.WriteLine("重写更换频道方法"); base.SetChannel(); } }
5.調用:
static void Main(string[] args) { // 创建一个遥控器 RemoteControl remoteControl = new ConcreteRemote(); //长虹电视机 remoteControl.implementor = new ChangHong(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.WriteLine(); // 三星牌电视机 remoteControl.implementor = new Samsung(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.Read(); }
這樣接實現了橋接用模式的設計,遙控器的功能實現方法不是在遙控器中實現了部分去控制一個電視機類別去封裝它,遙控器中只包含電視機類別的一個引用,透過橋接模式,我們把抽象化和實現化部分分離開了,這樣可以很好應對這兩方面的變化。
優點:
抽象介面與其實現解耦,期中的抽象與實作可以獨立的進行擴展,不會影響對方。
缺點:
增加了系統的複雜度。
使用場景:
1、如果一個系統需要在構件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個層次之間建立靜態的聯繫
2、設計要求實現化角色的任何改變不應影響客戶端,或實現化角色的改變對客戶端是完全透明的。
3、需要跨越多個平台的圖形和視窗系統上
4、一個類別存在兩個獨立變化的維度,且兩個維度都需要進行擴展。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。