.NET橋接模式講解
橋接模式的定義:
將抽象化(Abstraction)與實現(xiàn)化(Implementation)脫耦,使得二者可以獨立地變化。
橋接模式結構圖:

橋接模式中得角色:
抽象化(Abstraction)角色:抽象化給出的定義,并保存一個對實現(xiàn)化對象的引用。
修正抽象化(Refined Abstraction)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同, 實際上,這兩個接口可以非常不一樣。實現(xiàn)化角色應當只給出底層操作,而抽象化角色應當只給出基于底層操作的更高一層的操作。
結合實例說明:
引用一個電視遙控器的例子,對于每一個牌子的遙控器,都有相呼應的遙控器來控制,這時候我們想到的設可能是:抽象一個遙控器接口,里面有待實現(xiàn)的開機,關機,換頻道這樣一組功能方法。然后創(chuàng)建具體的遙控器類去繼承這個接口,實現(xiàn)里面的方法。這樣可以滿足每個電視機都實現(xiàn)了自己的遙控器,對于新增了其他類型的 電視機,只需要添加一個派生類就可以滿足新的遙控器的派生。但是哪一天,用戶要求在遙控中加入一個返回上一個頻道的功能時候,就需要改變抽象出來的遙控器 接口,需要向抽象類中添加一個新的方法,這樣就改變了抽象類的實現(xiàn)。如果用戶要求同時改變電視機的產(chǎn)品行為,和遙控器的行為方法,對于上面的設計會造成很 大的改動。使用橋接模式可以很好的解決這些問題。
使用:
1.首先抽象出電視機,提供遙控器改變的行為方法。
/// <summary>
/// 電視機,提供抽象方法
/// </summary>
public abstract class TV
{
public abstract void On();
public abstract void Off();
public abstract void tuneChannel();
}
2.創(chuàng)建具體的電視機,繼承自抽象電視機類:
/// <summary>
/// 三星牌電視機,重寫基類的抽象方法
/// </summary>
public class Samsung:TV
{
public override void On()
{
Console.WriteLine("三星牌電視機已經(jīng)打開了");
}
public override void Off()
{
Console.WriteLine("三星牌電視機已經(jīng)關掉了");
}
public override void tuneChannel()
{
Console.WriteLine("三星牌電視機換頻道");
}
}
/// <summary>
/// 長虹牌電視機,重寫基類的抽象方法
/// 提供具體的實現(xiàn)
/// </summary>
public class ChangHong : TV
{
public override void On()
{
Console.WriteLine("長虹牌電視機已經(jīng)打開了");
}
public override void Off()
{
Console.WriteLine("長虹牌電視機已經(jīng)關掉了");
}
public override void tuneChannel()
{
Console.WriteLine("長虹牌電視機換頻道");
}
}
3.然后抽象出概覽中的遙控器,扮演抽象話的角色。
/// <summary>
/// 抽象概念中的遙控器,扮演抽象化角色
/// </summary>
public abstract class RemoteControl
{
public TV implementor { get; set; }
/// <summary>
/// 開電視機
/// 這里抽象類中不再提供實現(xiàn)了,而是調(diào)用實現(xiàn)類中的實現(xiàn)
/// </summary>
public virtual void On()
{
implementor.On();
}
/// <summary>
/// 關電視機
/// </summary>
public virtual void Off()
{
implementor.Off();
}
/// <summary>
/// 換頻道
/// </summary>
public virtual void SetChannel()
{
implementor.tuneChannel();
}
}
4.創(chuàng)建具體遙控器類:這里面,我重寫了更換頻道的方法,其實還可以重寫其他的方法。
/// <summary>
/// 具體遙控器類
/// </summary>
public class ConcreteRemote:RemoteControl
{
/// <summary>
/// 重寫更換頻道方法
/// </summary>
public override void SetChannel()
{
Console.WriteLine("重寫更換頻道方法");
base.SetChannel();
}
}
5.調(diào)用:
static void Main(string[] args)
{
// 創(chuàng)建一個遙控器
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();
}
這樣接實現(xiàn)了橋接模式的設計,遙控器的功能實現(xiàn)方法不是在遙控器中去實現(xiàn)了,而是將實現(xiàn)部分用來另一個電視機類去封裝它,遙控器中只包含電視機類的一個引用,通過橋接模式,我們把抽象化和實現(xiàn)化部分分離開了,這樣可以很好應對這兩方面的變化。
優(yōu)點:
抽象接口與其實現(xiàn)解耦,期中的抽象和實現(xiàn)可以獨立的進行擴展,不會影響到對方。
缺點:
增加了系統(tǒng)的復雜度。
使用場景:
1、如果一個系統(tǒng)需要在構件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個層次之間建立靜態(tài)的聯(lián)系
2、設計要求實現(xiàn)化角色的任何改變不應當影響客戶端,或者實現(xiàn)化角色的改變對客戶端是完全透明的。
3、需要跨越多個平臺的圖形和窗口系統(tǒng)上
4、一個類存在兩個獨立變化的維度,且兩個維度都需要進行擴展。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

