## 前言 【**橋接模式**】是【**結構型**】設計模式的第二個模式,也有叫【橋模式】的,英文名稱:**Bridge Pattern**。 大家第一次看到這個名稱會想到什麼呢?我第一次看到這個模式根據名稱猜肯定是連接什麼東西的。因為橋在我們現實生活中經常是連接著A地和B地,再往後來發展,橋引申為 ...
前言
【橋接模式】是【結構型】設計模式的第二個模式,也有叫【橋模式】的,英文名稱:Bridge Pattern。
大家第一次看到這個名稱會想到什麼呢?我第一次看到這個模式根據名稱猜肯定是連接什麼東西的。因為橋在我們現實生活中經常是連接著A地和B地,再往後來發展,橋引申為一種紐帶,比如:絲綢之路是連接亞洲和歐洲的橋梁。橋是針對橋的使用環境來說的,解決了跨越和銜接的問題。在設計模式中的【橋模式】也有類似的概念,是連接了兩個不同維度的東西,而且這兩個維度又有經常的變化。
橋接設計模式的定義
在很多游戲場景中,會有這樣的情況:【裝備】本身會有的自己固有的邏輯,比如槍支,會有型號的問題,同時現在很多的游戲又在不同的介質平臺上運行和使用,這樣就使得游戲的【裝備】具有了兩個變化的維度:一個變化的維度為“平臺的變化”,另一個變化的維度為“型號的變化”。如果我們要寫代碼實現這款游戲,難道我們針對每種平臺都實現一套獨立的【裝備】嗎?復用在哪裡?如何應對這種“多維度的變化”?如何利用面向對象技術來使得【裝備】可以輕鬆地沿著“平臺”和“型號”兩個方向變化,而不引入額外的複雜度?橋接模式就是將抽象部分與實現部分分離,使它們都可以獨立地變化。
橋接設計模式的組成
橋接模式的結構包括Abstraction、RefinedAbstraction、Implementor、ConcreteImplementorA和ConcreteImplementorB五個部分,其中:
(1)抽象化角色(Abstraction):抽象化給出的定義,並保存一個對實現化對象(Implementor)的引用。
(2)修正抽象化角色(Refined Abstraction):擴展抽象化角色,改變和修正父類對抽象化的定義。
(3)實現化角色(Implementor):這個角色給出實現化角色的介面,但不給出具體的實現。必須指出的是,這個介面不一定和抽象化角色的介面定義相同,實際上,這兩個介面可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層的操作。
(4)具體實現化角色(Concrete Implementor):這個角色給出實現化角色介面的具體實現。
在橋接模式中,兩個類Abstraction和Implementor分別定義了抽象與行為類型的介面,通過調用兩介面的子類實現抽象與行為的動態組合。
橋接設計模式的實現
以資料庫為例來寫該模式的實現,每種資料庫都有自己的版本,但是每種資料庫在不同的平臺上實現又是不一樣的。比如:微軟的SqlServer資料庫,該資料庫它有2000版本、2005版本、2006版本、2008版本,後面還會有更新的版本。並且這些版本都是運行在Windows操作系統下的,如果要提供Lunix操作系統下的SqlServer怎麼辦呢?如果又要提供IOS操作系統下的SqlServer資料庫該怎麼辦呢?這個情況就可以使用橋接模式,也就是Brige模式
資料庫類型定義與實現
抽象類DataBase
/// <summary>
/// 該抽象類就是抽象介面的定義,該類型就相當於是Abstraction類型
/// </summary>
public abstract class Database
{
//通過組合方式引用平臺介面,此處就是橋梁,該類型相當於Implementor類型
protected PlatformImplementor _implementor;
//通過構造器註入,初始化平臺實現
protected Database(PlatformImplementor implementor)
{
this._implementor = implementor;
}
//創建資料庫--該操作相當於Abstraction類型的Operation方法
public abstract void Create();
}
SqlServer2000版本的資料庫繼承
/// <summary>
/// SqlServer2000版本的資料庫,相當於RefinedAbstraction類型
/// </summary>
public class SqlServer2000 : Database
{
//構造函數初始化
public SqlServer2000(PlatformImplementor implementor) : base(implementor) { }
public override void Create()
{
this._implementor.Process();
}
}
SqlServer2005版本的資料庫繼承
/// <summary>
/// SqlServer2005版本的資料庫,相當於RefinedAbstraction類型
/// </summary>
public class SqlServer2005 : Database
{
//構造函數初始化
public SqlServer2005(PlatformImplementor implementor) : base(implementor) { }
public override void Create()
{
this._implementor.Process();
}
}
平臺定義與實現
/// <summary>
/// 該抽象類就是實現介面的定義,該類型就相當於是Implementor類型
/// </summary>
public abstract class PlatformImplementor
{
//該方法就相當於Implementor類型的OperationImpl方法
public abstract void Process();
}
/// <summary>
/// SqlServer2000版本的資料庫針對Unix操作系統具體的實現,相當於ConcreteImplementorA類型
/// </summary>
public class SqlServer2000UnixImplementor : PlatformImplementor
{
public override void Process()
{
Console.WriteLine("SqlServer2000針對Unix的具體實現");
}
}
/// <summary>
/// SqlServer2005版本的資料庫針對Unix操作系統的具體實現,相當於ConcreteImplementorB類型
/// </summary>
public sealed class SqlServer2005UnixImplementor : PlatformImplementor
{
public override void Process()
{
Console.WriteLine("SqlServer2005針對Unix的具體實現");
}
}
調用
/// <summary>
/// 測試方法
/// </summary>
public void RunTest()
{
PlatformImplementor SqlServer2000UnixImp = new SqlServer2000UnixImplementor();
//還可以針對不同平臺進行擴展,也就是子類化,這個是獨立變化的
Database SqlServer2000Unix = new SqlServer2000(SqlServer2000UnixImp);
//資料庫版本也可以進行擴展和升級,也進行獨立的變化。
//以上就是兩個維度的變化。
//就可以針對Unix執行操作了
SqlServer2000Unix.Create();
}
橋接設計模式的優缺點
優點
-
把抽象介面與其實現解耦。
-
抽象和實現可以獨立擴展,不會影響到對方。
-
對客戶隱藏了具體實現細節。
缺點
- 增加了系統的複雜度
本文來自博客園,作者:碼農阿亮,轉載請註明原文鏈接:https://www.cnblogs.com/wml-it/p/17679918.html
技術的發展日新月異,隨著時間推移,無法保證本博客所有內容的正確性。如有誤導,請大家見諒,歡迎評論區指正!
開源庫地址,歡迎點亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群聲明: 本著技術在於分享,方便大家交流學習的初心,特此建立【編程內功修煉交流群】,為大家答疑解惑。熱烈歡迎各位愛交流學習的程式員進群,也希望進群的大佬能不吝分享自己遇到的技術問題和學習心得!進群方式:掃碼關註公眾號,後臺回覆【進群】。