bridge橋接模式是一種結構型模式,它主要應對的是:由於型別的固有羅輯,使得型別具有兩個或兩個以上的緯度變化。也就是要求抽象不應依賴於實現細節,實現細節應依賴於抽象。
《設計模式》中說到將抽象部分與實現部分分離,使他們可以獨立的變化。
舉個例子更清楚些,好像我們平時玩的遊戲中有ps版的,但是不是大家都有ps。這時我們等一段時間,一般會出pc版的或其他版本。由於支援遊戲的平台不一樣,但是如果我們編寫的遊戲程式為了適應另一種平台就要全部重新編寫的話豈不是很麻煩。再加上遊戲本身的變動,一句眾人皆知的話:「死定了」。
現在我們來看看bridge橋接模式,看看它是如何解決類似問題的,首先我們看看bridge模式的結構。
實際上,我們要做到的是把變化的部分提出,對其抽象,使變化獨立。那我們如何做呢?通過組合的方式將變化獨立出去。將乙個事物中的多個緯度變化分離。
下面舉乙個場景來理解一下,還是用汽車舉例,我現在要一輛車(bmw或bora)在路(waterroad或cement)上跑。現在有兩個緯度的變化點:汽車和路。也就是上圖中的abstractchangepoint1和abstractchangepoint2。abstractchangepoint1中包含有abstractchangepoint2物件成員。。**實現如下:
abstract
class abstractcar
public
abstract
string run();
public
abstract
string stop();
}abstract
class
abstractroad
以汽車為變化中心,用組裝的方式將兩個變化點結合起來。使路的變化和汽車隔離。下面來編寫路的實現。
class
waterroad:abstractroad
}class
cementroad:abstractroad
}然後再來編寫汽車的實現
class
bmwcar:abstractcar
public
override
string run()
public
override
string stop()
}class
broacar:abstractcar
public
override
string run()
public
override
string stop()
}然後我們在客戶**中呼叫這些類,首先,我想要這個場景是bmw在waterroad上跑,客戶端**如下:
static
void main(string args)
實現結果如下:
it is waterroad
bmw is running
bmw is stopped
如果我現在要一輛bora在cement上跑,我們只要稍微修改一下car的例項化就可以,**如下:
static
void main(string args)
實現結果如下:
it is cement
broa is running
broa is stopped
最後我們再來說說bridge模式的要點:
1、bridge模式使用「物件間的組合關係」解耦了抽象和實現之間固有的繫結關係,使得抽象和實現可以沿著各自的緯度來變化。
2、所謂抽象和實現沿著各自緯度的變化,即「子類化」它們,得到各個子類之後,便可以任意組合它們。
3、bridge模式有時候類似於多繼承方案,但是多繼承方案往往違背單一職責原則(即乙個類只有乙個變化的原因),復用性比較差。bridge模式是比多繼承方案更好的解決方法。
4、bridge模式的應用一般在「兩個非常強的變化緯度」,有時候即使有兩個變化的緯度,但是某個方向的變化緯度並不劇烈——換言之兩個變化不會導致縱橫交錯的結果,並不一定要使用bridge模式。
設計模式之橋接模式 Bridge
優點 1 將可能變化的部分單獨封裝起來,使得變化產生的影響最小 2 抽象部分和實現部分單獨變動,並且每一部分的擴充都不會破壞橋接模式搭起來 的架子 缺點 1 結構比較複雜 2 抽象類的修改影響到子類 include using namespace std 作業系統 class os class wi...
設計模式之橋接模式 Bridge
橋接模式屬於先天模式,這裡的先天模式就是說一開始就要把結構搭建好,方便後來的擴充套件,而不是對已經出現的模組和介面進行改進擴充套件的。橋接的核心在於實體類和操作類之間的聚合關係,這個聚合關係就是我們所說的 橋 不同於裝飾 和介面卡模式的中的聚合關係,橋接不存在兩者之間的繼承關係,操作類是完全解耦的,...
設計模式 橋接模式 Bridge
開啟銀行賬戶,顯示是哪個銀行的,賬戶型別是什麼 這裡給bank增加兩個實現類,乙個工商銀行,乙個農業銀行,給account也增加兩個實現類,乙個定期存款賬戶,乙個活期存款賬戶,詳細 如下 account介面 賬戶介面 author 七夜雪 create 2018 11 23 20 49 public...