C# 設(shè)計(jì)模式系列教程-橋接模式
1. 概述
將抽象部分(Abstraction)與實(shí)現(xiàn)部分(Implementor)分離,使它們可以獨(dú)立地變化。
2. 解決的問題
在軟件系統(tǒng)中,有些類型由于自身的邏輯,它具有兩個(gè)或多個(gè)維度的變化。為了解決這種多維度變化,又不引入復(fù)雜度,這就要使用Bridge模式。
3. 模式中的角色
2.1 抽象(Abstraction):定義抽象接口,該接口中包含實(shí)現(xiàn)具體行為、具體特征的Implementor接口。
2.2 提煉的抽象(RefinedAbstraction):繼承自Abstraction的子類,依舊是一個(gè)抽象的事物名。
2.3 實(shí)現(xiàn)(Implementor):定義具體行為,具體特征的應(yīng)用接口。
2.4 具體實(shí)現(xiàn)(ConcreteImplementor):實(shí)現(xiàn)Implementor。
4. 模式解讀
4.1 實(shí)現(xiàn)要點(diǎn)
Bridge模式使用“對(duì)象間的組合/聚合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來變化
4.2 橋接模式的類圖
4.3 橋接模式的實(shí)現(xiàn)代碼
/// <summary>
/// 實(shí)現(xiàn)
/// </summary>
public abstract class Implementor
{
public abstract void Opration();
}
public class ConcreteImplementorA : Implementor
{
public override void Opration()
{
Console.WriteLine("具體實(shí)現(xiàn)A的方法執(zhí)行。");
}
}
public class ConcreteImplementorB : Implementor
{
public override void Opration()
{
Console.WriteLine("具體實(shí)現(xiàn)B的方法執(zhí)行。");
}
}
/// <summary>
/// 抽象
/// </summary>
public abstract class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor = implementor;
}
public abstract void Opration();
}
/// <summary>
/// 被提煉的抽象
/// </summary>
public class RefinedAbstraction : Abstraction
{
public override void Opration()
{
implementor.Opration();
}
}
4.4 客戶端的調(diào)用
class Program
{
static void Main(string[] args)
{
Abstraction abstraction = new RefinedAbstraction();
abstraction.SetImplementor(new ConcreteImplementorA());
abstraction.Opration();
abstraction.SetImplementor(new ConcreteImplementorB());
abstraction.Opration();
Console.Read();
}
}
輸出結(jié)果:
具體實(shí)現(xiàn)A的方法執(zhí)行。
具體實(shí)現(xiàn)B的方法執(zhí)行。
5. 橋接模式是個(gè)比較復(fù)雜的模式,在對(duì)它總結(jié)之前,先看一個(gè)大家都非常熟悉的應(yīng)用:三層架構(gòu)
解讀:三層架構(gòu)中的業(yè)務(wù)邏輯層(LogicalTierInterface)橋接到了數(shù)據(jù)訪問層(DatabaseTierInterface),大家可以比較一下這個(gè)圖和上面橋接模式的圖是多么的一致。大家往往會(huì)在數(shù)據(jù)庫訪問這端做擴(kuò)展,比如現(xiàn)在增加對(duì)MySql的支持;往往只對(duì)業(yè)務(wù)邏輯層的實(shí)現(xiàn)(LogicalImplement)做一些內(nèi)部修改,而不是擴(kuò)展一個(gè)新的實(shí)現(xiàn)。如果你的應(yīng)用確實(shí)需要對(duì)業(yè)務(wù)邏輯層做一個(gè)擴(kuò)展(比如NewLogicalImplement),那么這個(gè)三層架構(gòu)對(duì)橋接模式的應(yīng)用就算是比較完整的了。
6. 模式總結(jié)
6.1 優(yōu)點(diǎn)
6.1.1 降低了沿著兩個(gè)或多個(gè)維度擴(kuò)展時(shí)的復(fù)雜度,防止類的過度膨脹。
6.1.2 解除了兩個(gè)或多個(gè)維度之間的耦合,使它們沿著各自方向變化而不互相影響
6.2 缺點(diǎn)
還未發(fā)現(xiàn)
6.3 適用場(chǎng)景
6.3.1 當(dāng)一個(gè)對(duì)象有多個(gè)變化因素時(shí),可以考慮使用橋接模式,通過抽象這些變化因素,將依賴具體實(shí)現(xiàn)修改為依賴抽象。
6.3.2 當(dāng)我們期望一個(gè)對(duì)象的多個(gè)變化因素可以動(dòng)態(tài)變化,而且不影響客戶端的程序使用時(shí)。
6.3.3 如果使用繼承的實(shí)現(xiàn)方案,會(huì)導(dǎo)致產(chǎn)生很多子類,任何一個(gè)變化因素都需要產(chǎn)生多個(gè)類來完成,就要考慮橋接模式。
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:C# 設(shè)計(jì)模式系列教程-建造者模式
欄 目:C#教程
下一篇:C#用鏈?zhǔn)椒椒ū磉_(dá)循環(huán)嵌套
本文標(biāo)題:C# 設(shè)計(jì)模式系列教程-橋接模式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6483.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10TortoiseSVN使用教程
- 01-10C#編程中枚舉類型的使用教程
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例
- 01-10C#中的delegate委托類型基本學(xué)習(xí)教程
- 01-10dotNet中的反射用法入門教程
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式
- 01-10C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


