1. 程式人生 > >橋接模式:探索JDBC底層實現

橋接模式:探索JDBC底層實現

一、目錄概要

二、問題探究

需求:假設要設計一個電腦商場管理系統的某個模組設計,電腦分為品牌和型別兩個緯度,我們應該怎麼解決?

按照初學者的思路,利用繼承就能簡單粗暴的實現,那我們來看下這種思路的設計類圖。

從電腦緯度劃分

package com.aaron.bridge;

public interface Computer {
    public void sale();
}

class Desktop implements Computer{
    @Override
    public void sale() {
        System.out.println("臺式電腦");
    }
}

class Laptop implements Computer{
    @Override
    public void sale() {
        System.out.println("膝上型電腦");
    }
}

class Pad implements Computer{
    @Override
    public void sale() {
        System.out.println("平板電腦");
    }
}

從品牌緯度劃分

package com.aaron.bridge;
// 巨集碁品牌的三種類型
public class AcerDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("巨集碁桌上型電腦");
    }
}

class AcerLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("巨集碁膝上型電腦");
    }
}

class AcerPad extends Pad{
    @Override
    public void sale() {
        System.out.println("巨集碁平板電腦");
    }
}
package com.aaron.bridge;

// 蘋果品牌的三種類型
public class AppleDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("蘋果桌上型電腦");
    }
}

class AppleLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("蘋果膝上型電腦");
    }
}

class ApplePad extends Pad{
    @Override
    public void sale() {
        System.out.println("蘋果平板電腦");
    }
}
package com.aaron.bridge;

//戴爾品牌的三種類型
public class DellDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("戴爾桌上型電腦");
    }
}

class DellLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("戴爾膝上型電腦");
    }
}

class DellPad extends Pad{
    @Override
    public void sale() {
        System.out.println("戴爾平板電腦");
    }
}

問題1:假設我們的系統按照上述思路設計,當我們新增一個品牌的時候,怎麼辦?

根據上述思路,從品牌緯度擴充套件品牌時直接新增桌上型電腦、膝上型電腦、平板電腦的類即可。

問題2:當我們新增一個機器型別的時候又該怎麼辦?
根據上述思路,在機器緯度型別擴充套件。

  1. 新增新的電腦機型。
  2. 在所有的品牌中,都新增新的機型。
package com.aaron.bridge;

// 電腦緯度
public interface Computer {
    public void sale();
}

class Desktop implements Computer{
    @Override
    public void sale() {
        System.out.println("臺式電腦");
    }
}

class Laptop implements Computer{
    @Override
    public void sale() {
        System.out.println("膝上型電腦");
    }
}

class Pad implements Computer{
    @Override
    public void sale() {
        System.out.println("平板電腦");
    }
}

class MaxPad implements Computer{
    @Override
    public void sale() {
        System.out.println("超大屏電腦");
    }
}

// 品牌緯度
public class DellDesktop extends Desktop{
    @Override
    public void sale() {
        System.out.println("戴爾桌上型電腦");
    }
}

class DellLaptop extends Laptop{
    @Override
    public void sale() {
        System.out.println("戴爾膝上型電腦");
    }
}

class DellPad extends Pad{
    @Override
    public void sale() {
        System.out.println("戴爾平板電腦");
    }
}

class DellPad extends Pad{
    @Override
    public void sale() {
        System.out.println("戴爾平板電腦");
    }
}

class DellMaxPad extends Pad{
    @Override
    public void sale() {
        System.out.println("超大屏平板電腦");
    }
}

思考:當我們新增少量的機型和品牌的時候,該方案的程式碼擴充套件性還是可以接受的。但是,再往遠思考一步。

  1. 假設電腦商城,新增10個品牌,再新增10種機型,怎麼辦?
  2. 系統已經上線,系統處於維護階段人力有限,怎麼辦?

問題:上述問題主要是把電腦和品牌兩個緯度耦合。

  1. 違背單一職責原則(一個類只由一個維度影響)
  2. 違背開閉原則(對拓展開放,對修改關閉)。

解決:將機器、品牌兩個緯度進行拆分,不要將他們耦合。

三、解決思路

3.1 什麼是橋接模式?

將兩個維度(抽象、實現)分離,使它們都可以獨立地變化。

3.2 橋接模式的分析
  1. 型別:桌上型電腦、膝上型電腦、平板電腦。
  2. 品牌:巨集碁、蘋果、戴爾。

關鍵:將上述問題拆分成兩個緯度型別和品牌。我們剛剛也討論了,主要解決拓展性問題。當新增一個新的機器型別或者品牌的時候,不會對其他機器型別或者品牌產生影響。

概念:簡單談下概念,重點根據類圖和實現程式碼去理解Abstraction、RefinedAbstraction、Implementor、ConcreteImplementor

Abstraction:抽象部分的介面。通常在這個物件裡面,要維護一個實現部分的物件引用,在抽象物件裡面的方法,需要呼叫實現部分的物件來完成。這個物件裡面的方法,通常都是跟具體的業務相關的方法。

RefinedAbstraction:
擴充套件抽象部分的介面,通常在這些物件裡面,定義跟實際業務相關的方法,這些方法的實現通常會使用Abstraction中定義的方法,也可能需要呼叫實現部分的物件來完成。

Implementor:
定義實現部分的介面,這個介面不用和Abstraction裡面的方法一致(根據約定優於配置原則,建議跟Abstraction一致。),通常是由Implementor介面提供基本的操作,而Abstraction裡面定義的是基於這些基本操作的業務方法,也就是說Abstraction定義了基於這些基本操作的較高層次的操作。

ConcreteImplementor:
真正實現Implementor介面的物件。

3.3 橋接模式實現

1、實體部分設計

package com.aaron.bridge;

/**
 * 
 * @author xiaoyongAaron
 * 品牌緯度-實現部分介面
 */
public interface ImplementorBrand {
    public void sale();
}

class  ConcreteImplementorAcer implements ImplementorBrand{

    @Override
    public void sale() {
        System.out.println("巨集碁品牌");
    }
}

class ConcreteImplementorApple implements ImplementorBrand{
    @Override
    public void sale() {
        System.out.println("蘋果品牌");
    }
}

class ConcreteImplementorDell implements ImplementorBrand{
    @Override
    public void sale() {
        System.out.println("戴爾品牌");        
    }
}

2、抽象部分設計

package com.aaron.bridge;

/**
 * 機器型別緯度-抽象部分
 * @author xiaoyongAaron
 */
public class AbstractionComputer {
     protected ImplementorBrand brand;
          
     public AbstractionComputer(ImplementorBrand brand){
         this.brand=brand;
     }
     
     public void sale(){
        brand.sale(); 
     };

}

/**
 * 擴充套件部分
 * @author xiaoyongAaron
 */
class RefinedAbstractionDesktop extends AbstractionComputer{
    public RefinedAbstractionDesktop(ImplementorBrand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        //新增自己的特性,實際業務。
        paly();
        super.sale();
    }
    
    public void paly(){
        System.out.println("我桌上型電腦抗摔打");
    }
}

class RefinedAbstractionLaptop extends AbstractionComputer{
    public RefinedAbstractionLaptop(ImplementorBrand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        //新增自己的特性,實際業務。
        lighting();
        super.sale();
    }
    
    public void lighting(){
        System.out.println("我膝上型電腦充電5分鐘,續航5小時");
    }
}

class RefinedAbstractionPad extends AbstractionComputer{
    public RefinedAbstractionPad(ImplementorBrand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        //新增自己的特性,實際業務。
        weighting();
        super.sale();
    }
    
    public void weighting(){
        System.out.println("我平板電腦便於攜帶");
    }
}

4、執行結果顯示

四、問題回顧

4.1 什麼是橋接模式、為什麼要橋接?

簡單說橋接模式就是把兩個緯度分離,所以說當我們在實際開發的時候,遇到兩個維度問題的時候,直接條件反射橋接模式。

就像上述問題,當有兩個維度(品牌+機器型別)賦予給一個類的時候,基於單一職責原則,需要把它們解耦。那通過上述範例可知,那麼我們就需要一座橋一樣,把兩個緯度用一箇中間物(類或者介面)把它們關聯起來,從而達到我們的目的。

4.2 橋接模式怎麼接?

核心:如何把Implementor物件傳遞到抽象介面。

  1. 如上述描述,利用建構函式傳參。
  2. 創造無參建構函式,新增get、set方法。
  3. 工廠模式:參考設計模式的工廠模式。
  4. IOC控制反轉,最經典的就是Spring容器。內部的實現原理原本建立物件都是由我們自己管理,但是把這一步驟交給容器管理,就不用我們擔心了。例如在JDBC的設計當中,充當這個角色的就是DriverManage去把物件注入在抽象介面當中。
4.3 橋接模式本質和經驗
  1. 本質:抽象與實現(兩個緯度)分離。
  2. 多用物件組合(has-A),少用繼承。
  3. 開閉原則:我們應該對程式碼拓展開放,拒絕程式碼修改。

實際應用場景:

作者:碼農皮邱
原文:https://www.cnblogs.com/qiuyong/p/11107180.html
推薦:您的支援是對博主深入思考總結的最大鼓勵,要是有需要關注公眾號與作者面對面對話交流~
說明:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結,尊重作者的勞動成果。

相關推薦

模式探索JDBC底層實現

一、目錄概要 二、問題探究 需求:假設要設計一個電腦商場管理系統的某個模組設計,電腦分為品牌和型別兩個緯度,我們應該怎麼解決? 按照初學者的思路,利用繼承就能簡單粗暴的實現,那我們來看下這種思路的設計類圖。 從電腦緯度劃分 package com.aaron.bridge; public inter

07模式——C++實現

目錄 一、介紹 二、應用場景 三、要點 四、樣例 五、優缺點 六、和介面卡模式異同  一、介紹  橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構

設計模式模式及程式碼示例、模式jdbc中的體現、注意事項

# 0、背景 加入一個手機分為多種款式,不同款式分為不同品牌。這些詳細分類下分別進行操作。 如果傳統做法,需要將手機,分為不同的子類,再繼續分,基本屬於一個龐大的多叉樹,然後每個葉子節點進行相同名稱、但是細節不同的功能實現。 **問題**: 1. **類爆炸**:類的增加基本沒有任何優

設計模式之十八模式(Bridge)

ora 它的 pla sin string src ams down ng- 橋接模式: 將抽象部分和它的實現部分相分離開來,以使它們能夠單獨地變化。 UML圖: 主要包含: Abstraction:定義了抽象部分的接口。操作一個實現部分對

VMware中CentOS配置靜態IP進行網絡訪問(NAT方式和模式

name nat模式 定義 終端 star static state alt 相關 傳送門:http://blog.csdn.net/zhangatle/article/details/77417310 其實這個博主的博客最是適合新手學習,踩過的坑讓我再踩一踩,印象深刻

Linux01CentOS7模式主機和虛擬機ping不通問題解決

nat 選擇 了解 模式 blog entos 類型 linux linu 一、背景   新搭建了CentOS7的虛擬機,使用的是NAT模式,可以和主機進行連接,但是網絡適配方式改為橋接模式後,虛擬機和主機一直不能ping通,幾經折騰,終於找到了原因,是我的虛擬網絡適配器沒

模式-Bridge(Java實現)

技術分享 world java實現 () open() count end ring idg 橋接模式-Bridge 橋梁模式的用意是"將抽象化(Abstraction)與實現化(Implementation)脫耦, 將"類的功能層次結構" 與 "類的實現層次結構"分離為

C#設計模式系列模式(Bridge)

span -i 原來 派生 引用 分享圖片 on() 版本 nta 1.1定義 當一個抽象可能有多個實現時,通常用繼承來進行協調。抽象類定義對該抽象的接口,而具體的子類則用不同的方式加以實現。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立地進行

java面試題之----jdbc中使用的設計模式模式

connect @override 操作 tro orb his order ng- return 1.JDBC(JavaDatabase Connectivity) JDBC是以統一方式訪問數據庫的API. 它提供了獨立於平臺的數據庫訪問,也就是說,有了JDB

Linux模式、NAT模式下不能ping通百度

最近在搞Hadoop的時候,突然間想到要用網路,然後按照傳統的方式進行橋接方式、NAT方式進行配置網路,很尷尬的是用ping命令在終端下內網外網都是能ping通的,到了ping百度,就不行了!!!!! ping完就停在這裡了 真的是很無奈啊!? 本來以為是因為校園網有限制,但是用手機的熱

Java設計模式9模式

一、橋接模式: 橋接模式是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。 二、示例程式碼: 先來考慮下如下場景: 傳送訊息功能。基本上所有帶業務流程處理的系統都會有這樣的功能,比如OA上

結構型模式及相關應用

文章目錄 橋接(Bridge) 優缺點 應用場景 JDBC的應用 參考資料 橋接(Bridge) 將抽象部分與它的具體實現部分分離,使它們都可以獨立地變化。 通過組合的方式建立兩個類之間

弄透VMware虛擬機器的網路設定三大模式模式,主機模式、NAT模式

前言:我們在使用的虛擬機器的時候,總會碰到很多網路設定相關的東西。我在深受其害之後,苦心專研之後,決定統一整理下虛擬機器網路設定的三大模式: 1,橋接模式:你的虛擬機器能夠上網能夠訪問你的主機,網路上其他計算機和自己的計算機都能訪問到你的虛擬機器。 2,主機模式:顧

23種設計模式之(十)模式(python_c++實現

23種設計模式之(十)橋接模式(Bridge) 本文主要介紹23種設計模式之組合模式,附詳細python/c++示例程式碼。 - 概念 - 應用場景 - 注意事項 - 程式碼示例 - 總結 - 程式碼連結 橋接模式(Bridge)

設計模式對比策略模式、狀態模式模式

《策略模式》與《狀態模式》有相同的類結構圖,與《橋接模式》結構非常相似。 目的不同: 策略模式:策略模式的目的是封裝一系列的演算法,使這些演算法能夠相互替換。 狀態模式:封裝狀態對應的行為,並在內部狀態改變的時候改變物件的行為。 橋接模式:分離抽象部分與實現部分,使得它們可以獨立地變化。 狀態模式與策略模

解決VMware中Kali虛擬機器使用模式時報錯“裝置'VMnet0'上的網沒有執行。”

操作環境: 執行在VMware中的Kali Linux虛擬機器 執行Windows 10作業系統的物理機 問題說明: 今天在使用Kali時,將Kali的聯網模式切換成了“橋接模式”,準備直接連線物理網路,但是卻報錯: 報錯文字如下: 裝

JDBC規範談模式

作者:叩丁狼教育,原創文章,轉載請註明出處。  JDBC是以統一方式訪問資料庫的API.它提供了獨立於平臺的資料庫訪問,也就是說,有了JDBC API,我們就不必為訪問Oracle資料庫專門寫一個程式,為訪問Sybase資料庫又專門寫一個程式等等,只需要用JDBC API寫

JAVA設計模式(7)模式

橋接模式將定義與其實現分離。 它是一種結構模式。 橋接(Bridge)模式涉及充當橋接的介面。橋接使得具體類與介面實現者類無關。 這兩種型別的類可以改變但不會影響對方。當需要將抽象與其實現去耦合時使用橋接解耦(分離),使得兩者可以獨立地變化。這種型別的設計模式屬於結構模式,因為此模式通過在它

通過例子學設計模式之--模式以及使用場景說明(C++實現)

             橋是一種結構。橋接模式的類圖和橋很像,是一種結構型的設計模式。             通常情況下,橋兩邊各有一個橋墩,每個橋墩我們可以理解為一個抽象類,或者是一個變化。中間的橋樑我們可以理解為類的“關聯”,這個關聯就是聚合。這樣就組成了橋接模式。

設計模式(七)模式

優點:   ① 分離抽象介面及其實現部分。提高了比繼承更好的解決方案。   ② 橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴充套件一個維度,都不需要修改原有系統。 缺點:   ① 橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發