Java結(jié)構(gòu)型模式之橋接模式詳解
一.介紹
橋接模式(Bridge Pattern)屬于結(jié)構(gòu)型模式。用于將抽象與其實(shí)現(xiàn)解耦,使得二者可以獨(dú)立變化。橋接模式使用組合/聚合替代繼承,從而連接功能層面與實(shí)現(xiàn)層面,把強(qiáng)關(guān)聯(lián)轉(zhuǎn)為弱關(guān)聯(lián)之后進(jìn)行雙向擴(kuò)展
適配器模式可以在抽象層不變的情況下,對(duì)實(shí)現(xiàn)進(jìn)行擴(kuò)展和變化;而橋接模式可以在抽象和實(shí)現(xiàn)兩個(gè)維度獨(dú)立擴(kuò)展和變化
二.場(chǎng)景理解
JPA是ORM框架的抽象,或者說是Java提供的持久化標(biāo)準(zhǔn),而Hibernate與TopLink則是ORM框架的具體實(shí)現(xiàn),而在Hibernate框架下,又有針對(duì)一系列數(shù)據(jù)庫廠商的具體實(shí)現(xiàn),圖中是以繼承的方式表現(xiàn)Hibernate、TopLink框架下不同數(shù)據(jù)庫廠商的行為變化

上圖我們將ORM框架數(shù)記為N,將數(shù)據(jù)庫廠商數(shù)記為M,如果要新增一個(gè)ORM框架,就會(huì)生成M個(gè)子類,如果新增了一個(gè)數(shù)據(jù)庫廠商,就要新增N個(gè)子類,兩個(gè)維度不能夠獨(dú)立的進(jìn)行擴(kuò)展,而且最終子類的個(gè)數(shù)是N*M,代碼復(fù)雜度會(huì)指數(shù)型增長(zhǎng),可能會(huì)造成類爆炸

JDBC是Java提供的訪問關(guān)系型數(shù)據(jù)庫的一套標(biāo)準(zhǔn),根據(jù)合成復(fù)用原則(組合/聚合優(yōu)先于繼承),在JPA中組合了不同數(shù)據(jù)庫廠商的抽象,此時(shí)就在功能層面和實(shí)現(xiàn)層面建立起了一座橋梁,無論是ORM框架個(gè)數(shù)還是數(shù)據(jù)庫廠商的個(gè)數(shù)都可以進(jìn)行獨(dú)立的擴(kuò)展了,而最終子類的個(gè)數(shù)僅是N+M
三.UML類圖

四.具體代碼
業(yè)務(wù)代碼
//抽象化角色
public abstract class JPA {
protected JDBC jdbc;
protected JPA(JDBC jdbc) {
this.jdbc = jdbc;
}
public abstract void insert();
}
//擴(kuò)展抽象化角色
class Hibernate extends JPA{
protected Hibernate(JDBC jdbc) {
super(jdbc);
}
@Override
public void insert() {
System.out.println("Hibernate環(huán)境");
jdbc.insert();
}
}
//擴(kuò)展抽象化角色
class TopLink extends JPA{
protected TopLink(JDBC jdbc) {
super(jdbc);
}
@Override
public void insert() {
System.out.println("TopLink環(huán)境");
jdbc.insert();
}
}
interface JDBC{
void insert();
}
//具體實(shí)現(xiàn)化角色
class MySQL implements JDBC{
@Override
public void insert() {
System.out.println("MySQL執(zhí)行新增操作");
}
}
//具體實(shí)現(xiàn)化角色
class Oracle implements JDBC{
@Override
public void insert() {
System.out.println("Oracle執(zhí)行新增操作");
}
}
客戶端
public class Client {
public static void main(String[] args) {
//數(shù)據(jù)庫廠商
JDBC jdbc = new MySQL();
//ORM框架
JPA jpa = new Hibernate(jdbc);
jpa.insert();
}
}
五.優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 符合開閉原則
- 符合合成復(fù)用原則
- 抽象與實(shí)現(xiàn)分離,擴(kuò)展能力極強(qiáng)
缺點(diǎn)
- 組合/聚合關(guān)系建立在抽象層,增加系統(tǒng)的理解與設(shè)計(jì)難度
六.使用場(chǎng)景
- 當(dāng)一個(gè)系統(tǒng)存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展
- 當(dāng)一個(gè)系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致類的個(gè)數(shù)急劇增加
到此這篇關(guān)于Java結(jié)構(gòu)型模式之橋接模式詳解的文章就介紹到這了,更多相關(guān)Java橋接模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA2020.2創(chuàng)建springboot項(xiàng)目卡死在reading maven project的問題
這篇文章主要介紹了關(guān)于2020.2IDEA用spring Initializr創(chuàng)建maven的springboot項(xiàng)目卡死在reading maven project的問題描述及解決方法,感興趣的朋友跟隨小編一起看看吧2020-09-09
解決Spring運(yùn)行時(shí)報(bào)錯(cuò):Consider defining a bean o
該文章主要講述了在使用Spring框架時(shí),如果遇到某個(gè)bean未找到的錯(cuò)誤,應(yīng)該在配置文件中定義該bean,解決方法是在對(duì)應(yīng)的類上添加@Component注解2025-01-01
Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程,Thread類包含諸多操作線程的方法,非常重要,需要的朋友可以參考下2015-12-12
SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
IntelliJ?IDEA?2023版本創(chuàng)建Spring項(xiàng)目時(shí)Java只能選擇17或21的問題解決方法
spring-boot是一個(gè)基于Java的開源框架,用于快速構(gòu)建生產(chǎn)級(jí)別的應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于IntelliJ?IDEA?2023版本創(chuàng)建Spring項(xiàng)目時(shí)Java只能選擇17或21的問題解決方法,需要的朋友可以參考下2024-07-07
從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率
這篇文章主要介紹了從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時(shí)間解決方案
這篇文章主要介紹了詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時(shí)間解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

