摘要:橋接模式定義橋接模式定義抽象化角色它的主要職責(zé)是定義出該角色的行為,同時保存一個對實現(xiàn)化角色的引用,該角色一般是抽象類。這種優(yōu)雅的實現(xiàn)數(shù)據(jù)庫切換方式就是利用了橋接模式。
Decouple an abstraction from its implementation so that the two can vary independently.
橋接模式(Bridge Pattern):將抽象和實現(xiàn)解耦, 使得兩者可以獨(dú)立地變化。
另外一種解釋是:一個類存在兩個(或多個)獨(dú)立變化的維度,我們通過組合的方式,讓這兩個(或多個)維度可以獨(dú)立進(jìn)行擴(kuò)展。
聽起來可能還是很深奧,沒關(guān)系,下面通過例子講解。
①、Abstraction
抽象化角色:它的主要職責(zé)是定義出該角色的行為, 同時保存一個對實現(xiàn)化角色的引用, 該角色一般是抽象類。
②、Implementor
實現(xiàn)化角色:它是接口或者抽象類, 定義角色必需的行為和屬性。
③、RefinedAbstraction
修正抽象化角色:它引用實現(xiàn)化角色對抽象化角色進(jìn)行修正。
④、ConcreteImplementor
具體實現(xiàn)化角色:它實現(xiàn)接口或抽象類定義的方法和屬性。
實現(xiàn)化類:
public interface Implementor { void doSomething();}
具體實現(xiàn)化類:
public class ConcreteImplementor1 implements Implementor{ @Override public void doSomething() { // 具體業(yè)務(wù)邏輯處理 }}
public class ConcreteImplementor2 implements Implementor{ @Override public void doSomething() { // 具體業(yè)務(wù)邏輯 }}
這里定義了兩個,可能有多個。
抽象化角色:
public abstract class Abstraction { // 定義對實現(xiàn)化角色的引用 private Implementor implementor; public Abstraction(Implementor implementor){ this.implementor = implementor; } // 自身的行為和屬性 public void request(){ this.implementor.doSomething(); } // 獲取實現(xiàn)化角色 public Implementor getImplementor(){ return implementor; }}
修正抽象化角色:
public class RefinedAbstraction extends Abstraction{ // 覆寫構(gòu)造函數(shù) public RefinedAbstraction(Implementor implementor){ super(implementor); } // 修正父類的行為 @Override public void request() { super.request(); }}
測試:
public class BridgeClient { public static void main(String[] args) { // 定義一個實現(xiàn)化角色 Implementor implementor = new ConcreteImplementor1(); // 定義一個抽象化角色 Abstraction abstraction = new RefinedAbstraction(implementor); // 執(zhí)行方法 abstraction.request(); }}
如果我們的實現(xiàn)化角色有很多的子接口, 然后是一堆的子實現(xiàn)。 在構(gòu)造函數(shù)中傳遞一個明確的實現(xiàn)者, 代碼也是很清晰的。
我們在剛開始用 JDBC 直連數(shù)據(jù)庫的時候,會有這樣一段代碼:
Class.forName("com.mysql.cj.jdbc.Driver");//加載及注冊JDBC驅(qū)動程序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ù)庫換成 Oracle 數(shù)據(jù)庫,只需要把第一行代碼中的 com.mysql.cj.jdbc.Driver 換成oracle.jdbc.driver.OracleDriver 就可以了。
這種優(yōu)雅的實現(xiàn)數(shù)據(jù)庫切換方式就是利用了橋接模式。
我們首先看 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("Cant register driver!"); } }}
這段代碼 Class.forName("com.mysql.cj.jdbc.Driver") 作用有兩個:
①、要求 JVM 查找并加載指定的 Driver 類。
②、執(zhí)行該類的靜態(tài)代碼,也就是將 MySQL Driver 注冊到 DriverManager 類中。
接著我們看 DriverManager 類:
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 實現(xiàn)類(比如,com.mysql.cj.jdbc.Driver)注冊到 DriverManager 之后,后續(xù)所有對 JDBC 接口的調(diào)用,都會委派到對具體的 Driver 實現(xiàn)類來執(zhí)行。而 Driver 實現(xiàn)類都實現(xiàn)了相同的接口(java.sql.Driver ),這也是可以靈活切換 Driver 的原因。
①、抽象和實現(xiàn)分離
這也是橋梁模式的主要特點, 它完全是為了解決繼承的缺點而提出的設(shè)計模式。 在該模式下, 實現(xiàn)可以不受抽象的約束, 不用再綁定在一個固定的抽象層次上。
②、優(yōu)秀的擴(kuò)充能力
看看我們的例子, 想增加實現(xiàn)? 沒問題! 想增加抽象, 也沒有問題! 只要對外暴露的接口層允許這樣的變化, 我們已經(jīng)把變化的可能性減到最小。
③、實現(xiàn)細(xì)節(jié)對客戶透明
客戶不用關(guān)心細(xì)節(jié)的實現(xiàn), 它已經(jīng)由抽象層通過聚合關(guān)系完成了封裝。
①、如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們在抽象層建立一個關(guān)聯(lián)關(guān)系。
②、對于那些不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
③、一個類存在兩個獨(dú)立變化的維度,且這兩個維度都需要進(jìn)行擴(kuò)展。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/124537.html
摘要:橋接模式橋接是用于把抽象化與現(xiàn)實化解耦,使得二者可以獨(dú)立變化,這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它通過提供抽象化和現(xiàn)實化之間的橋接結(jié)構(gòu),實現(xiàn)二者的解耦。所以接口和實現(xiàn)是可以組合的,這種組合我們稱之為橋接模式。主要用在系統(tǒng)開始設(shè)計的時候使用。 橋接模式 橋接(Bridge)是用于把抽象化與現(xiàn)實化解耦,使得二者可以獨(dú)立變化,這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它通過提供抽象化和現(xiàn)實化之間的橋...
摘要:橋接模式中的所謂脫耦,就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用關(guān)聯(lián)關(guān)系組合或者聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對獨(dú)立地變化,這就是橋接模式的用意。 0x01.定義與類型 定義:將抽象部分與它的具體實現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類與類之間的耦合度,減少了系統(tǒng)中類的數(shù)量,也減少了代碼量。 橋接模式中的所謂脫耦,就是指在一個軟...
摘要:橋接模式的核心在于將抽象部分和它的實現(xiàn)部分分離,使它們都可以獨(dú)立的變化。看起來這個版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實現(xiàn)版本這個實現(xiàn)包含了三個函數(shù)。這個例子體現(xiàn)了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請求的原因?...
摘要:橋接模式屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構(gòu),來實現(xiàn)二者的解耦。相關(guān)模式裝飾模式與橋接模式在一定程度上都是為了減少子類的數(shù)目,避免出現(xiàn)復(fù)雜的繼承關(guān)系。 橋接模式(Brideg Pattern)屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構(gòu),來實現(xiàn)二者的解...
摘要:適配器模式應(yīng)用場景適配器模式應(yīng)用場景修改已使用的接口某個已經(jīng)投產(chǎn)中的接口需要修改,這時候使用適配器最好。適配器模式適配器模式是一種事后的補(bǔ)救策略。1、什么是適配器模式?Convert the interface of a class into another interface clients expect.Adapter lets classes work together that co...
閱讀 739·2023-04-25 19:43
閱讀 3983·2021-11-30 14:52
閱讀 3811·2021-11-30 14:52
閱讀 3872·2021-11-29 11:00
閱讀 3806·2021-11-29 11:00
閱讀 3905·2021-11-29 11:00
閱讀 3584·2021-11-29 11:00
閱讀 6193·2021-11-29 11:00