橋接模式的定義:
將抽象化(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、一個類存在兩個獨立變化的維度,且兩個維度都需要進行擴展。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持幫客之家。