女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 14:30 ? 次閱讀

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、橋接模式定義

圖片

①、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("Can't 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< DriverInfo > registeredDrivers = new CopyOnWriteArrayList< DriverInfo >();

  //...
  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 的原因。

圖片

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ì)客戶(hù)透明

客戶(hù)不用關(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ò)展。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8924

    瀏覽量

    153152
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3899

    瀏覽量

    65726
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4367

    瀏覽量

    64105
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70216
  • JDBC
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    13584
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    AG32VF-MIPI應(yīng)用場(chǎng)景

    to 1.2Gbps MIPI D-PHY以及DSI硬核 AG32VF-MIPI的應(yīng)用場(chǎng)景,包括了基本的MIPI屏幕驅(qū)動(dòng),以及各種顯示場(chǎng)合,如下圖所示。 AG32VF-MIPI系列產(chǎn)品即將正式發(fā)布。
    發(fā)表于 01-22 08:56

    STM32待機(jī)模式適合用于那些應(yīng)用場(chǎng)景

    對(duì)于查看STM32低功耗模式,共有三種,其中最省電的為待機(jī)模式,但是待機(jī)模式喚醒后相當(dāng)于軟件復(fù)位了,ram及寄存器中的值都復(fù)位了,僅僅是備份域的寄存器除外,因此有個(gè)疑問(wèn),待機(jī)模式適合用
    發(fā)表于 05-07 07:46

    關(guān)于模式遇到的問(wèn)題

    VMware使用模式,已經(jīng)手動(dòng)設(shè)置ip地址和主機(jī)ip同一網(wǎng)段,但是ifconfig顯示的ip地址卻和vmnet8(NAT)同一網(wǎng)段?怎么解決?
    發(fā)表于 10-16 15:06

    CentOS靜態(tài)IP配置(模式

    [2018-08-26]-[CentOS]CentOS靜態(tài)IP配置(模式
    發(fā)表于 05-12 08:27

    特斯拉電動(dòng)汽車(chē)不下電,除了哨兵模式和寵物模式外還有哪些應(yīng)用場(chǎng)景

    如題。特斯拉推出哨兵和寵物模式后,想討論下在不下電的情況下,還能有哪些應(yīng)用場(chǎng)景
    發(fā)表于 06-09 11:27

    COM和CORBA的與應(yīng)用

    根據(jù)CORBA規(guī)范,闡述了組件的體系結(jié)構(gòu)和六種模型,并引申出八種方式,比較了各種
    發(fā)表于 02-27 16:07 ?29次下載
    COM和CORBA的<b class='flag-5'>橋</b><b class='flag-5'>接</b>與應(yīng)用

    網(wǎng)橋和,網(wǎng)橋和是什么意思

    網(wǎng)橋和,網(wǎng)橋和是什么意思 網(wǎng)橋(Bridge)也稱(chēng)橋接器,是連接兩個(gè)局域網(wǎng)的存儲(chǔ)轉(zhuǎn)發(fā)設(shè)備,用它可以完成具有相同或相似體系
    發(fā)表于 03-20 16:03 ?1.3w次閱讀

    模式的目標(biāo)與設(shè)計(jì)

    模式的目標(biāo)是使對(duì)象的抽象部分與實(shí)現(xiàn)部分分離,使之可以分別獨(dú)立變化,以盡量避免產(chǎn)生耦合。
    的頭像 發(fā)表于 06-01 14:29 ?704次閱讀
    <b class='flag-5'>橋</b><b class='flag-5'>接</b><b class='flag-5'>模式</b>的目標(biāo)與設(shè)計(jì)

    設(shè)計(jì)模式結(jié)構(gòu)性:模式

    模式不是將兩個(gè)不相干的類(lèi)鏈接,而是將一個(gè)需要多維度變化的類(lèi)拆分成抽象部分和實(shí)現(xiàn)部分,并且在抽象層對(duì)兩者做組合關(guān)聯(lián),是用組合的方式來(lái)解決繼承的問(wèn)題。
    的頭像 發(fā)表于 06-08 10:49 ?1026次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>結(jié)構(gòu)性:<b class='flag-5'>橋</b><b class='flag-5'>接</b><b class='flag-5'>模式</b>

    php設(shè)計(jì)模式和應(yīng)用場(chǎng)景

    ,從小型的網(wǎng)站到大型的企業(yè)級(jí)應(yīng)用程序。 下面將介紹一些常見(jiàn)的PHP設(shè)計(jì)模式及其應(yīng)用場(chǎng)景。 單例模式(Singleton Pattern): 單例模式用于限制類(lèi)的實(shí)例化,確保一個(gè)類(lèi)只有一
    的頭像 發(fā)表于 12-04 14:54 ?1146次閱讀

    無(wú)線(xiàn)和mesh組網(wǎng)哪個(gè)好?

    無(wú)線(xiàn)和Mesh組網(wǎng)都是用于擴(kuò)展無(wú)線(xiàn)網(wǎng)絡(luò)覆蓋范圍的技術(shù),但它們的工作原理和應(yīng)用場(chǎng)景有所不同。 無(wú)線(xiàn)接通常是一對(duì)一的連接,相對(duì)較容易設(shè)置和維護(hù)。它的優(yōu)點(diǎn)在于簡(jiǎn)單性,適用于需要建立點(diǎn)對(duì)
    的頭像 發(fā)表于 01-19 16:12 ?9560次閱讀

    應(yīng)變片1/4、半、全的區(qū)別及其應(yīng)用場(chǎng)景

    應(yīng)變片1/4、半、全的區(qū)別及其應(yīng)用場(chǎng)景 應(yīng)變片是一種利用應(yīng)變效應(yīng)制造電場(chǎng)的器件,可將機(jī)械變形轉(zhuǎn)化為電信號(hào)。它廣泛應(yīng)用于傳感器、開(kāi)關(guān)、位移檢測(cè)等領(lǐng)域。根據(jù)應(yīng)變片的電橋結(jié)構(gòu)和應(yīng)
    的頭像 發(fā)表于 02-04 14:48 ?2.1w次閱讀

    網(wǎng)絡(luò)模式是什么? 網(wǎng)絡(luò)模式和路由模式的區(qū)別

    網(wǎng)絡(luò)模式是一種網(wǎng)絡(luò)連接方式,它可以將多個(gè)設(shè)備連接在一起,使它們可以相互通信。在網(wǎng)絡(luò)模式
    的頭像 發(fā)表于 05-10 13:48 ?5389次閱讀

    電阻應(yīng)變片不同方法有什么優(yōu)缺點(diǎn)?

    電阻應(yīng)變片的方法通常有三種基本形式:四分之一(1/4)、半(1/2)和全
    的頭像 發(fā)表于 05-16 17:14 ?7322次閱讀

    與VPN的比較分析

    在現(xiàn)代網(wǎng)絡(luò)通信中,和VPN是兩種常見(jiàn)的技術(shù),它們各自有著獨(dú)特的應(yīng)用場(chǎng)景和優(yōu)勢(shì)。主要用于連接同一局域網(wǎng)內(nèi)的設(shè)備,而VPN則用于在不同網(wǎng)
    的頭像 發(fā)表于 01-10 11:08 ?670次閱讀