.NET橋接模式講解
橋接模式的定義:
將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化。
橋接模式結(jié)構(gòu)圖:
橋接模式中得角色:
抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
修正抽象化(Refined Abstraction)角色:擴(kuò)展抽象化角色,改變和修正父類對(duì)抽象化的定義。
實(shí)現(xiàn)化(Implementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。必須指出的是,這個(gè)接口不一定和抽象化角色的接口定義相同, 實(shí)際上,這兩個(gè)接口可以非常不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。
結(jié)合實(shí)例說明:
引用一個(gè)電視遙控器的例子,對(duì)于每一個(gè)牌子的遙控器,都有相呼應(yīng)的遙控器來控制,這時(shí)候我們想到的設(shè)可能是:抽象一個(gè)遙控器接口,里面有待實(shí)現(xiàn)的開機(jī),關(guān)機(jī),換頻道這樣一組功能方法。然后創(chuàng)建具體的遙控器類去繼承這個(gè)接口,實(shí)現(xiàn)里面的方法。這樣可以滿足每個(gè)電視機(jī)都實(shí)現(xiàn)了自己的遙控器,對(duì)于新增了其他類型的 電視機(jī),只需要添加一個(gè)派生類就可以滿足新的遙控器的派生。但是哪一天,用戶要求在遙控中加入一個(gè)返回上一個(gè)頻道的功能時(shí)候,就需要改變抽象出來的遙控器 接口,需要向抽象類中添加一個(gè)新的方法,這樣就改變了抽象類的實(shí)現(xiàn)。如果用戶要求同時(shí)改變電視機(jī)的產(chǎn)品行為,和遙控器的行為方法,對(duì)于上面的設(shè)計(jì)會(huì)造成很 大的改動(dòng)。使用橋接模式可以很好的解決這些問題。
使用:
1.首先抽象出電視機(jī),提供遙控器改變的行為方法。
/// <summary> /// 電視機(jī),提供抽象方法 /// </summary> public abstract class TV { public abstract void On(); public abstract void Off(); public abstract void tuneChannel(); }
2.創(chuàng)建具體的電視機(jī),繼承自抽象電視機(jī)類:
/// <summary> /// 三星牌電視機(jī),重寫基類的抽象方法 /// </summary> public class Samsung:TV { public override void On() { Console.WriteLine("三星牌電視機(jī)已經(jīng)打開了"); } public override void Off() { Console.WriteLine("三星牌電視機(jī)已經(jīng)關(guān)掉了"); } public override void tuneChannel() { Console.WriteLine("三星牌電視機(jī)換頻道"); } } /// <summary> /// 長(zhǎng)虹牌電視機(jī),重寫基類的抽象方法 /// 提供具體的實(shí)現(xiàn) /// </summary> public class ChangHong : TV { public override void On() { Console.WriteLine("長(zhǎng)虹牌電視機(jī)已經(jīng)打開了"); } public override void Off() { Console.WriteLine("長(zhǎng)虹牌電視機(jī)已經(jīng)關(guān)掉了"); } public override void tuneChannel() { Console.WriteLine("長(zhǎng)虹牌電視機(jī)換頻道"); } }
3.然后抽象出概覽中的遙控器,扮演抽象話的角色。
/// <summary> /// 抽象概念中的遙控器,扮演抽象化角色 /// </summary> public abstract class RemoteControl { public TV implementor { get; set; } /// <summary> /// 開電視機(jī) /// 這里抽象類中不再提供實(shí)現(xiàn)了,而是調(diào)用實(shí)現(xiàn)類中的實(shí)現(xiàn) /// </summary> public virtual void On() { implementor.On(); } /// <summary> /// 關(guān)電視機(jī) /// </summary> public virtual void Off() { implementor.Off(); } /// <summary> /// 換頻道 /// </summary> public virtual void SetChannel() { implementor.tuneChannel(); } }
4.創(chuàng)建具體遙控器類:這里面,我重寫了更換頻道的方法,其實(shí)還可以重寫其他的方法。
/// <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)建一個(gè)遙控器 RemoteControl remoteControl = new ConcreteRemote(); //長(zhǎng)虹電視機(jī) remoteControl.implementor = new ChangHong(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.WriteLine(); // 三星牌電視機(jī) remoteControl.implementor = new Samsung(); remoteControl.On(); remoteControl.SetChannel(); remoteControl.Off(); Console.Read(); }
這樣接實(shí)現(xiàn)了橋接模式的設(shè)計(jì),遙控器的功能實(shí)現(xiàn)方法不是在遙控器中去實(shí)現(xiàn)了,而是將實(shí)現(xiàn)部分用來另一個(gè)電視機(jī)類去封裝它,遙控器中只包含電視機(jī)類的一個(gè)引用,通過橋接模式,我們把抽象化和實(shí)現(xiàn)化部分分離開了,這樣可以很好應(yīng)對(duì)這兩方面的變化。
優(yōu)點(diǎn):
抽象接口與其實(shí)現(xiàn)解耦,期中的抽象和實(shí)現(xiàn)可以獨(dú)立的進(jìn)行擴(kuò)展,不會(huì)影響到對(duì)方。
缺點(diǎn):
增加了系統(tǒng)的復(fù)雜度。
使用場(chǎng)景:
1、如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間添加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系
2、設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端,或者實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的。
3、需要跨越多個(gè)平臺(tái)的圖形和窗口系統(tǒng)上
4、一個(gè)類存在兩個(gè)獨(dú)立變化的維度,且兩個(gè)維度都需要進(jìn)行擴(kuò)展。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++設(shè)計(jì)模式之橋接模式
- php設(shè)計(jì)模式 Bridge (橋接模式)
- 用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析
- c#橋接模式(bridge結(jié)構(gòu)模式)用法實(shí)例
- 深入理解JavaScript系列(44):設(shè)計(jì)模式之橋接模式詳解
- 舉例講解Python中的Null模式與橋接模式編程
- 詳解CentOS下VMware用橋接模式,靜態(tài)ip上外網(wǎng)
- 簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式
- 輕松掌握J(rèn)ava橋接模式
- java設(shè)計(jì)模式之橋接模式(Bridge)
相關(guān)文章
對(duì)ASP.Net的WebAPI項(xiàng)目進(jìn)行測(cè)試
這篇文章介紹了對(duì)WebAPI項(xiàng)目進(jìn)行測(cè)試的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04.Net Core和jexus配置HTTPS服務(wù)方法
下面小編就為大家分享一篇.Net Core和jexus配置HTTPS服務(wù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02asp.net中CSharpThinking擴(kuò)展方法分析
這篇文章主要介紹了asp.net中CSharpThinking擴(kuò)展方法,實(shí)例講述了擴(kuò)展方法的特征及應(yīng)用,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11asp.net 購物車實(shí)現(xiàn)詳細(xì)代碼
asp.net 購物車實(shí)現(xiàn)詳細(xì)代碼2008-11-11