在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

橋接模式應用場景

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-09 14:30 ? 次閱讀

1、什么是橋接模式?

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

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

另外一種解釋是:一個類存在兩個(或多個)獨立變化的維度,我們通過組合的方式,讓這兩個(或多個)維度可以獨立進行擴展。

聽起來可能還是很深奧,沒關系,下面通過例子講解。

2、橋接模式定義

圖片

①、Abstraction

抽象化角色:它的主要職責是定義出該角色的行為, 同時保存一個對實現化角色的引用, 該角色一般是抽象類。

②、Implementor

實現化角色:它是接口或者抽象類, 定義角色必需的行為和屬性。

③、RefinedAbstraction

修正抽象化角色:它引用實現化角色對抽象化角色進行修正。

④、ConcreteImplementor

具體實現化角色:它實現接口或抽象類定義的方法和屬性。

3、橋接模式通用代碼實現

實現化類:

public interface Implementor {

    void doSomething();
}

具體實現化類:

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

這里定義了兩個,可能有多個。

抽象化角色:

public abstract class Abstraction {
    // 定義對實現化角色的引用
    private Implementor implementor;

    public Abstraction(Implementor implementor){
        this.implementor = implementor;
    }

    // 自身的行為和屬性
    public void request(){
        this.implementor.doSomething();
    }

    // 獲取實現化角色
    public Implementor getImplementor(){
        return implementor;
    }
}

修正抽象化角色:

public class RefinedAbstraction extends  Abstraction{
    // 覆寫構造函數
    public RefinedAbstraction(Implementor implementor){
        super(implementor);
    }

    // 修正父類的行為
    @Override
    public void request() {
        super.request();
    }
}

測試:

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

    }
}

如果我們的實現化角色有很多的子接口, 然后是一堆的子實現。在構造函數中傳遞一個明確的實現者, 代碼也是很清晰的。

4、橋接模式經典例子—JDBC

我們在剛開始用 JDBC 直連數據庫的時候,會有這樣一段代碼:

Class.forName("com.mysql.cj.jdbc.Driver");//加載及注冊JDBC驅動程序
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 數據庫換成 Oracle 數據庫,只需要把第一行代碼中的 com.mysql.cj.jdbc.Driver 換成oracle.jdbc.driver.OracleDriver 就可以了。

這種優雅的實現數據庫切換方式就是利用了橋接模式。

我們首先看 Driver 類:

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") 作用有兩個:

①、要求 JVM 查找并加載指定的 Driver 類。

②、執行該類的靜態代碼,也就是將 MySQL Driver 注冊到 DriverManager 類中。

接著我們看 DriverManager 類:

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()));
  }
  //...
}

當我們把具體的 Driver 實現類(比如,com.mysql.cj.jdbc.Driver)注冊到 DriverManager 之后,后續所有對 JDBC 接口的調用,都會委派到對具體的 Driver 實現類來執行。而 Driver 實現類都實現了相同的接口(java.sql.Driver ),這也是可以靈活切換 Driver 的原因。

圖片

5、橋接模式優點

①、抽象和實現分離

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

②、優秀的擴充能力

看看我們的例子, 想增加實現?沒問題!想增加抽象, 也沒有問題!只要對外暴露的接口層允許這樣的變化, 我們已經把變化的可能性減到最小。

③、實現細節對客戶透明

客戶不用關心細節的實現, 它已經由抽象層通過聚合關系完成了封裝。

6、橋接模式應用場景

①、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。

②、對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。

③、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8885

    瀏覽量

    152974
  • 數據庫
    +關注

    關注

    7

    文章

    3884

    瀏覽量

    65576
  • 函數
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63852
  • 代碼
    +關注

    關注

    30

    文章

    4880

    瀏覽量

    69999
  • JDBC
    +關注

    關注

    0

    文章

    25

    瀏覽量

    13555
收藏 人收藏

    評論

    相關推薦

    AG32VF-MIPI應用場景

    to 1.2Gbps MIPI D-PHY以及DSI硬核 AG32VF-MIPI的應用場景,包括了基本的MIPI屏幕驅動,以及各種顯示場合,如下圖所示。 AG32VF-MIPI系列產品即將正式發布。
    發表于 01-22 08:56

    STM32待機模式適合用于那些應用場景

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

    關于模式遇到的問題

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

    特斯拉電動汽車不下電,除了哨兵模式和寵物模式外還有哪些應用場景

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

    COM和CORBA的與應用

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

    網橋和,網橋和是什么意思

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

    模式的目標與設計

    模式的目標是使對象的抽象部分與實現部分分離,使之可以分別獨立變化,以盡量避免產生耦合。
    的頭像 發表于 06-01 14:29 ?676次閱讀
    <b class='flag-5'>橋</b><b class='flag-5'>接</b><b class='flag-5'>模式</b>的目標與設計

    設計模式結構性:模式

    模式不是將兩個不相干的類鏈接,而是將一個需要多維度變化的類拆分成抽象部分和實現部分,并且在抽象層對兩者做組合關聯,是用組合的方式來解決繼承的問題。
    的頭像 發表于 06-08 10:49 ?992次閱讀
    設計<b class='flag-5'>模式</b>結構性:<b class='flag-5'>橋</b><b class='flag-5'>接</b><b class='flag-5'>模式</b>

    php設計模式和應用場景

    ,從小型的網站到大型的企業級應用程序。 下面將介紹一些常見的PHP設計模式及其應用場景。 單例模式(Singleton Pattern): 單例模式用于限制類的實例化,確保一個類只有一
    的頭像 發表于 12-04 14:54 ?1104次閱讀

    無線和mesh組網哪個好?

    無線和Mesh組網都是用于擴展無線網絡覆蓋范圍的技術,但它們的工作原理和應用場景有所不同。 無線接通常是一對一的連接,相對較容易設置和維護。它的優點在于簡單性,適用于需要建立點對
    的頭像 發表于 01-19 16:12 ?9347次閱讀

    應變片1/4、半、全的區別及其應用場景

    應變片1/4、半、全的區別及其應用場景 應變片是一種利用應變效應制造電場的器件,可將機械變形轉化為電信號。它廣泛應用于傳感器、開關、位移檢測等領域。根據應變片的電橋結構和應
    的頭像 發表于 02-04 14:48 ?2w次閱讀

    路由器路由器怎樣 路由器接好還是中繼好

    路由器和中繼是常用的網絡擴展方式,用于擴大網絡覆蓋范圍,提供更好的網絡連接。這兩種方式在不同的場景下有著各自的優勢,下面將詳細介紹如何
    的頭像 發表于 02-20 14:26 ?7122次閱讀

    網絡模式是什么? 網絡模式和路由模式的區別

    網絡模式是一種網絡連接方式,它可以將多個設備連接在一起,使它們可以相互通信。在網絡模式
    的頭像 發表于 05-10 13:48 ?5265次閱讀

    電阻應變片不同方法有什么優缺點?

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

    與VPN的比較分析

    在現代網絡通信中,和VPN是兩種常見的技術,它們各自有著獨特的應用場景和優勢。主要用于連接同一局域網內的設備,而VPN則用于在不同網
    的頭像 發表于 01-10 11:08 ?588次閱讀
    主站蜘蛛池模板: 午夜看一级特黄a大片黑 | 久久精品国产福利国产琪琪 | 狠狠操婷婷 | 又粗又大的机巴好爽欧美 | 五月综合激情视频在线观看 | 成人精品视频一区二区三区 | 69久久夜色精品国产69 | 欧美女人天堂 | 男女www视频在线看网站 | 中文字幕在线播放第一页 | 国产成人毛片视频不卡在线 | 免费爱爱视频网站 | 亚洲图片 欧美色图 | 拍拍拍无档又黄又爽视频 | 色综合社区 | 欧美在线性 | 久操免费在线 | av2021天堂网手机版 | 老司机狠狠k免费毛片 | 黄色午夜网站 | 欧美zoozzooz性欧美 | 精品三级内地国产在线观看 | 欧美精品色精品一区二区三区 | 全免费午夜一级毛片真人 | 久久精品99| 性欧美丰满xxxx性久久久 | 综合7799亚洲伊人爱爱网 | 伊人网99 | 免费在线观看黄色 | 国产全肉乱妇杂乱视频 | 狠狠色噜噜狠狠狠狠 | 两性午夜欧美高清做性 | 日本激情网 | 色婷婷色婷婷 | 一区二区三区四区精品 | 正在播放淫亚洲 | 四虎影视大全免费入口 | 性大特级毛片视频 | 日本电影在线观看黄 | 精品国产污污免费网站入口 | 亚洲国内精品久久 |