定義:java
將抽象部分與它的實現部分分離,使他們均可以獨立的變化。編程
這裏的抽象和實現分離是指把實現的多種方式獨立出來,讓他們各自變化;實現系統可能有多角度分類,每一種分類都有可能變化,把這種多角度分離出來讓它們獨立變化,減小它們的耦合,這就是橋接模式。this
好比手機這個抽象,它的實現既能夠按照品牌分類,也能夠按照軟件分類;品牌和軟件各自又都會變化(增長品牌,增長軟件等),橋接模式核心意圖就是把這些實現獨立出來。spa
結構圖: 設計
代碼(手機有軟件分類和品牌分類兩個維度)code
//抽象Abstraction(手機品牌抽象)
對象
class PhoneBrand
blog
{
繼承
protected:
token
PhoneSoft
c
;PhoneSoft
public:
//設置手機軟件方法(橋接方法)
void
Set
(const PhoneSoft
PhoneSoft&
c
)PhoneSoft
{
this.
c
= PhoneSoft
;c
PhoneSoft
}
//抽象軟件運行方法
void run
() = 0;
}
//RefinedAbstraction(具體品牌)
class PhoneBrandA
: PhoneBrand
{
public:
//軟件運行方法
void run
()
{ soft.run();
}
}
//Implementor(手機軟件抽象類)
class PhoneSoft
{
public:
void run () = 0;
}
//ConcreteImplementorA(具體手機軟甲:遊戲)
class PhoneSoftGame :
PhoneSoft
{
public:
//軟件遊戲的實現
void run ()
{
。。。;
}
}
//ConcreteImplementorB(具體手機軟甲:MP3)
class PhoneSoftMP3 :
PhoneSoft
{
public:
//軟件mp3的實現
void run ()
{
。。。;
}
}
//客戶端(實現一個帶有遊戲和mp3軟件的品牌A手機)
PhoneBrand*
A = new PhoneBrandA
("A");//建立品牌手機A
PhoneSoftGame c
PhoneSoftGame;
A.Set
PhoneSoft(
);//加載遊戲軟件c
PhoneSoftGame
A.run();
cPhoneSoftMP3
PhoneSoftMP3
;
A.Set
PhoneSoft(
);//加載mps軟件c
PhoneSoftMP3
A.run();
使用時機:
當須要多角度去分類實現對象,而只是用繼承會形成大量類的增長,還會違背開閉原則,這時請考慮橋接模式。
優勢:
一、 橋接模式提升了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不須要修改原有系統。
二、實現細節對客戶透明,能夠對用戶隱藏實現細節。
缺點:
一、橋接模式的引入會增長系統的理解與設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程。
二、橋接模式要求正確識別出系統中兩個獨立變化的維度,所以其使用範圍具備必定的侷限性