成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java設(shè)計(jì)模式之(六)——橋接模式

番茄西紅柿 / 3066人閱讀

摘要:橋接模式定義橋接模式定義抽象化角色它的主要職責(zé)是定義出該角色的行為,同時(shí)保存一個(gè)對(duì)實(shí)現(xiàn)化角色的引用,該角色一般是抽象類(lèi)。這種優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換方式就是利用了橋接模式。

1、什么是橋接模式?

Decouple an abstraction from its implementation so that the two can vary independently.

橋接模式(Bridge Pattern):將抽象和實(shí)現(xiàn)解耦, 使得兩者可以獨(dú)立地變化。

另外一種解釋是:一個(gè)類(lèi)存在兩個(gè)(或多個(gè))獨(dú)立變化的維度,我們通過(guò)組合的方式,讓這兩個(gè)(或多個(gè))維度可以獨(dú)立進(jìn)行擴(kuò)展。

聽(tīng)起來(lái)可能還是很深?yuàn)W,沒(méi)關(guān)系,下面通過(guò)例子講解。

2、橋接模式定義

image-20210908222425355

①、Abstraction

抽象化角色:它的主要職責(zé)是定義出該角色的行為, 同時(shí)保存一個(gè)對(duì)實(shí)現(xiàn)化角色的引用, 該角色一般是抽象類(lèi)。

②、Implementor

實(shí)現(xiàn)化角色:它是接口或者抽象類(lèi), 定義角色必需的行為和屬性。

③、RefinedAbstraction

修正抽象化角色:它引用實(shí)現(xiàn)化角色對(duì)抽象化角色進(jìn)行修正。

④、ConcreteImplementor

具體實(shí)現(xiàn)化角色:它實(shí)現(xiàn)接口或抽象類(lèi)定義的方法和屬性。

3、橋接模式通用代碼實(shí)現(xiàn)

實(shí)現(xiàn)化類(lèi):

public interface Implementor {    void doSomething();}

具體實(shí)現(xiàn)化類(lèi):

public class ConcreteImplementor1 implements Implementor{    @Override    public void doSomething() {        // 具體業(yè)務(wù)邏輯處理    }}
public class ConcreteImplementor2 implements Implementor{    @Override    public void doSomething() {        // 具體業(yè)務(wù)邏輯    }}

這里定義了兩個(gè),可能有多個(gè)。

抽象化角色:

public abstract class Abstraction {    // 定義對(duì)實(shí)現(xiàn)化角色的引用    private Implementor implementor;    public Abstraction(Implementor implementor){        this.implementor = implementor;    }    // 自身的行為和屬性    public void request(){        this.implementor.doSomething();    }    // 獲取實(shí)現(xiàn)化角色    public Implementor getImplementor(){        return implementor;    }}

修正抽象化角色:

public class RefinedAbstraction extends  Abstraction{    // 覆寫(xiě)構(gòu)造函數(shù)    public RefinedAbstraction(Implementor implementor){        super(implementor);    }    // 修正父類(lèi)的行為    @Override    public void request() {        super.request();    }}

測(cè)試:

public class BridgeClient {    public static void main(String[] args) {        // 定義一個(gè)實(shí)現(xiàn)化角色        Implementor implementor = new ConcreteImplementor1();        // 定義一個(gè)抽象化角色        Abstraction abstraction = new RefinedAbstraction(implementor);        // 執(zhí)行方法        abstraction.request();    }}

如果我們的實(shí)現(xiàn)化角色有很多的子接口, 然后是一堆的子實(shí)現(xiàn)。 在構(gòu)造函數(shù)中傳遞一個(gè)明確的實(shí)現(xiàn)者, 代碼也是很清晰的。

4、橋接模式經(jīng)典例子—JDBC

我們?cè)趧傞_(kāi)始用 JDBC 直連數(shù)據(jù)庫(kù)的時(shí)候,會(huì)有這樣一段代碼:

Class.forName("com.mysql.cj.jdbc.Driver");//加載及注冊(cè)JDBC驅(qū)動(dòng)程序String url = "jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";Connection con = DriverManager.getConnection(url);Statement stmt = con.createStatement();String query = "select * from test";ResultSet rs=stmt.executeQuery(query);while(rs.next()) {  rs.getString(1);  rs.getInt(2);}

如果我們想要把 MySQL 數(shù)據(jù)庫(kù)換成 Oracle 數(shù)據(jù)庫(kù),只需要把第一行代碼中的 com.mysql.cj.jdbc.Driver 換成oracle.jdbc.driver.OracleDriver 就可以了。

這種優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換方式就是利用了橋接模式。

我們首先看 Driver 類(lèi):

package com.mysql.cj.jdbc;import java.sql.DriverManager;import java.sql.SQLException;public class Driver extends NonRegisteringDriver implements java.sql.Driver {    public Driver() throws SQLException {    }    static {        try {            DriverManager.registerDriver(new Driver());        } catch (SQLException var1) {            throw new RuntimeException("Cant register driver!");        }    }}

這段代碼 Class.forName("com.mysql.cj.jdbc.Driver") 作用有兩個(gè):

①、要求 JVM 查找并加載指定的 Driver 類(lèi)。

②、執(zhí)行該類(lèi)的靜態(tài)代碼,也就是將 MySQL Driver 注冊(cè)到 DriverManager 類(lèi)中。

接著我們看 DriverManager 類(lèi):

public class DriverManager {  private final static CopyOnWriteArrayList registeredDrivers = new CopyOnWriteArrayList();  //...  static {    loadInitialDrivers();    println("JDBC DriverManager initialized");  }  //...  public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {    if (driver != null) {      registeredDrivers.addIfAbsent(new DriverInfo(driver));    } else {      throw new NullPointerException();    }  }  public static Connection getConnection(String url, String user, String password) throws SQLException {    java.util.Properties info = new java.util.Properties();    if (user != null) {      info.put("user", user);    }    if (password != null) {      info.put("password", password);    }    return (getConnection(url, info, Reflection.getCallerClass()));  }  //...}

當(dāng)我們把具體的 Driver 實(shí)現(xiàn)類(lèi)(比如,com.mysql.cj.jdbc.Driver)注冊(cè)到 DriverManager 之后,后續(xù)所有對(duì) JDBC 接口的調(diào)用,都會(huì)委派到對(duì)具體的 Driver 實(shí)現(xiàn)類(lèi)來(lái)執(zhí)行。而 Driver 實(shí)現(xiàn)類(lèi)都實(shí)現(xiàn)了相同的接口(java.sql.Driver ),這也是可以靈活切換 Driver 的原因。

image-20210908233556259

5、橋接模式優(yōu)點(diǎn)

①、抽象和實(shí)現(xiàn)分離

這也是橋梁模式的主要特點(diǎn), 它完全是為了解決繼承的缺點(diǎn)而提出的設(shè)計(jì)模式。 在該模式下, 實(shí)現(xiàn)可以不受抽象的約束, 不用再綁定在一個(gè)固定的抽象層次上。

②、優(yōu)秀的擴(kuò)充能力

看看我們的例子, 想增加實(shí)現(xiàn)? 沒(méi)問(wèn)題! 想增加抽象, 也沒(méi)有問(wèn)題! 只要對(duì)外暴露的接口層允許這樣的變化, 我們已經(jīng)把變化的可能性減到最小。

③、實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明

客戶不用關(guān)心細(xì)節(jié)的實(shí)現(xiàn), 它已經(jīng)由抽象層通過(guò)聚合關(guān)系完成了封裝。

6、橋接模式應(yīng)用場(chǎng)景

①、如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過(guò)橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。

②、對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。

③、一個(gè)類(lèi)存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展。

作者:IT可樂(lè)

資源:微信搜【IT可樂(lè)】關(guān)注我,回復(fù) 【電子書(shū)】有我特別篩選的免費(fèi)電子書(shū)。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不能轉(zhuǎn)載,否則保留追究法律責(zé)任的權(quán)利。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124537.html

相關(guān)文章

  • JavaScript設(shè)計(jì)模式系列橋接模式

    摘要:橋接模式橋接是用于把抽象化與現(xiàn)實(shí)化解耦,使得二者可以獨(dú)立變化,這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過(guò)提供抽象化和現(xiàn)實(shí)化之間的橋接結(jié)構(gòu),實(shí)現(xiàn)二者的解耦。所以接口和實(shí)現(xiàn)是可以組合的,這種組合我們稱之為橋接模式。主要用在系統(tǒng)開(kāi)始設(shè)計(jì)的時(shí)候使用。 橋接模式 橋接(Bridge)是用于把抽象化與現(xiàn)實(shí)化解耦,使得二者可以獨(dú)立變化,這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過(guò)提供抽象化和現(xiàn)實(shí)化之間的橋...

    jzzlee 評(píng)論0 收藏0
  • 設(shè)計(jì)模式橋接模式

    摘要:橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系組合或者聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。 0x01.定義與類(lèi)型 定義:將抽象部分與它的具體實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類(lèi)與類(lèi)之間的耦合度,減少了系統(tǒng)中類(lèi)的數(shù)量,也減少了代碼量。 橋接模式中的所謂脫耦,就是指在一個(gè)軟...

    kycool 評(píng)論0 收藏0
  • JavaScript面試系列:JavaScript設(shè)計(jì)模式橋接模式和懶加載

    摘要:橋接模式的核心在于將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化??雌饋?lái)這個(gè)版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實(shí)現(xiàn)版本這個(gè)實(shí)現(xiàn)包含了三個(gè)函數(shù)。這個(gè)例子體現(xiàn)了橋接模式的作用。 我寫(xiě)的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請(qǐng)求的原因?...

    tracymac7 評(píng)論0 收藏0
  • 一起學(xué)設(shè)計(jì)模式 - 橋接模式

    摘要:橋接模式屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解耦。相關(guān)模式裝飾模式與橋接模式在一定程度上都是為了減少子類(lèi)的數(shù)目,避免出現(xiàn)復(fù)雜的繼承關(guān)系。 橋接模式(Brideg Pattern)屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解...

    tinysun1234 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式(八)——適配器模式

    摘要:適配器模式應(yīng)用場(chǎng)景適配器模式應(yīng)用場(chǎng)景修改已使用的接口某個(gè)已經(jīng)投產(chǎn)中的接口需要修改,這時(shí)候使用適配器最好。適配器模式適配器模式是一種事后的補(bǔ)救策略。1、什么是適配器模式?Convert the interface of a class into another interface clients expect.Adapter lets classes work together that co...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<