前面寫了那麼設計模式了,有沒有以爲有些模式之間很相似,甚至感受做用重疊了,模式並非徹底隔離和獨立的,有的模式內部其實用到了其餘模式的技術,可是又有本身的創新點,若是一味地認爲每一個模式都是獨一無二,與其餘模式徹底區別的,這是一種誤區html
這個例子清晰而直白的說明了爲啥要用橋接模式,我就拿過來用了,連接在參考裏python
• 第二種設計方案是根據實際須要對形狀和顏色進行組合。數據庫
對於有兩個變化維度(即兩個變化的緣由)的系統,採用方案二來進行設計系統中類的個數更少,且系統擴展更爲方便。設計方案二便是橋接模式的應用。橋接模式將繼承關係轉換爲關聯關係,從而下降了類與類之間的耦合,減小了代碼編寫量。編程
通俗點講就是在不一樣的地方之間搭一座橋,讓他們鏈接起來,能夠相互通信和使用。
在模式中,就是爲被分離了的抽象部分和實現部分來搭橋。
橋接模式中的橋接是單向的,也就是隻能是抽象部分的對象去使用實現部分的對象,而不能反過來,也就是個單向橋。設計模式
抽象化角色就像是一個水杯的手柄,而實現化角色和具體實現化角色就像是水杯的杯身。手柄控制杯身,這就是此模式別名「柄體」的來源。架構
具體實現化(Concrete Implementor)角色:這個角色給出實現化角色接口的具體實現spa
這些是從百度百科抄的.net
橋樑模式的用意是"將抽象化(Abstraction)與實現化(Implementation)脫耦,使得兩者能夠獨立地變化"。這句話有三個關鍵詞,也就是抽象化、實現化和脫耦。設計
1)抽象化orm
2)實現化
3)脫耦
將兩個角色之間的繼承關係改成聚合關係,就是將它們之間的強關聯改換成爲弱關聯。所以,橋樑模式中的所謂脫耦,就是指在一個軟件系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使二者能夠相對獨立地變化。這就是橋樑模式的用意。
這些是從百度百科抄的
• 橋接模式的引入會增長系統的理解與設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程。
• 橋接模式要求正確識別出系統中兩個獨立變化的維度,所以其使用範圍具備必定的侷限性。
1)Java語言經過Java虛擬機實現了平臺的無關性
2)JDBC驅動器
橋樑模式在Java應用中一個很是典型的例子就是JDBC驅動器。JDBC爲全部的關係型數據庫提供一個通用的界面。一個應用系統動態的選擇一個合適的驅動器,而後經過驅動器向數據庫引擎發出指令。這個過程就是將抽象角色的行爲委派給實現角色的過程。
抽象角色能夠針對任何數據庫引擎發出查詢指令,由於抽象角色並不直接�與數據庫引擎打交道,JDBC驅動器負責這個底層的工做。因爲JDBC驅動器的存在,應用系統能夠不依賴於數據庫引擎的細節而獨立的演化;同時數據庫引擎也能夠獨立�於應用系統的細節而獨立的演化。兩個獨立的等級結構圖以下圖所示,左邊是JDBC API的等級結構,右邊是JDBC驅動器的等級結構,應用程序是創建在JDBC API的基礎之上的。
應用系統做爲一個等級結構,與JDBC驅動器這個等級結構是相對獨立的,它們之間沒有靜態的強關聯。應用系統經過委派與JDBC驅動器相互做用,這是一個橋樑模式的例子。
JDBC這種架構,把抽象部分和具體實現部分分離開來,從而使得抽象部分和具體實現部分均可以獨立的擴展。對於應用程序而言,之遙選用不一樣的驅動,就可讓程序操做不一樣的數據庫,而無需更改應用程序,從而實如今不一樣的數據庫上移植;對於驅動程序而言,爲數據庫實現不一樣的驅動程序,並不會影響應用程序。
# 接口實現類 class Implementor: def Operation(self): raise NotImplementedError class ConcreteImplementorA(Implementor): def Operation(self): print("實現 A的方法") class ConcreteImplementorB(Implementor): def Operation(self): print("實現 B的方法") # 抽象類 class Abstraction(): def __init__(self,implementor): self.implementor = implementor def Operation(self): raise NotImplementedError class RefineAbstraction(Abstraction): def Operation(self): self.implementor.Operation() if __name__ == "__main__": a = ConcreteImplementorA() b = ConcreteImplementorB() aa = RefineAbstraction(a) ab = RefineAbstraction(b) aa.Operation() ab.Operation()
#抽象類:人 class people: def set_skill(self,skill): self.skill=skill def perform_skill(self): pass #具體抽象類:花匠 class hua_j(people): def perform_skill(self): print('我是花匠') self.skill.perform_skill() #具體抽象類:木匠 class mu_j(people): def perform_skill(self): print('我是木匠') self.skill.perform_skill() #具體抽象類:鐵匠 class tie_j(people): def perform_skill(self): print('我是鐵匠') self.skill.perform_skill() #功能類,也是實現類 class skill: def perform_skill(self): pass #具體功能類,也是具體實現類 種花 class skill_hua(skill): def perform_skill(self): print('我會種花') #具體功能類,也是具體實現類 作木桌子 class skill_mu: def perform_skill(self): print('我會作木桌子') #具體功能類,也是具體實現類 作鐵桌子 class skill_tie: def perform_skill(self): print('我會作鐵桌子') #具體功能類,也是具體實現類 作老師 class skill_teacher: def perform_skill(self): print('我會作老師,能夠教學生') #具體功能類,也是具體實現類 作傢俱 class skill_jj: def perform_skill(self): print('我會作傢俱') def main(): h=hua_j() #花匠 m=mu_j() #木匠 t=tie_j() #鐵匠 sh=skill_hua()# 本事:會種花 sm=skill_mu() #本事:會作木頭桌子 st=skill_tie() #本事:會作鐵桌子 s_t=skill_teacher() #本事:會教學生 s_jj=skill_jj() #本事:會作傢俱 h.set_skill(sh) #給花匠set種花的本事 h.perform_skill() #花匠 種花 h.set_skill(s_t) #給花匠set作老師的本事 h.perform_skill() #花匠教學生 print('=============') m.set_skill(sm) #給木匠set 作木桌子的本事 m.perform_skill() #木匠 作木桌子 m.set_skill(s_t) #給木匠set作老師的本事 m.perform_skill() #木匠教學生 m.set_skill(s_jj) #給木匠set作傢俱的本事 m.perform_skill() #木匠作傢俱 print('=============') t.set_skill(st) #給木匠set 作木桌子的本事 t.perform_skill() #木匠 作木桌子 t.set_skill(s_t) #給木匠set作老師的本事 t.perform_skill() #木匠教學生 t.set_skill(s_jj) #給木匠set作傢俱的本事 t.perform_skill() #木匠作傢俱 if __name__ == '__main__': main()
參考
https://www.cnblogs.com/WindSun/p/10260547.html
https://baike.baidu.com/item/%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F/5293399?fr=aladdin
https://www.cnblogs.com/zyrblog/p/9233189.html
https://blog.csdn.net/sunyqcn/article/details/85113751
https://www.jianshu.com/p/775cb53a4da2
https://www.cnblogs.com/qq_841161825/articles/10142201.html
https://blog.csdn.net/weixin_41431904/article/details/80783839