GOF设计模式之桥接模式
一、引入
現需要提供能夠繪制4種不同顏色且筆畫粗細有大中小3種型號的畫筆。
方法一:蠟筆
我們需要準備3*4=12支蠟筆,也就是說必須準備12個具體的蠟筆類
方法二:毛筆
只需要準備三種型號的毛筆,外加四個顏料盒,用3+4=7個類就可以實現12支蠟筆的功能
二、定義
橋接模式的定義:將抽象與實現分離,使它們可以獨立變化。它是用關聯關系代替繼承關系來實現,從而降低了抽象和實現這兩個可變維度的耦合度。
三、實現
基礎實現
//實現化角色 interface Implementor {public void OperationImpl(); } //具體實現化角色 class ConcreteImplementorA implements Implementor {public void OperationImpl(){System.out.println("具體實現化(Concrete Implementor)角色被訪問" );} //抽象化角色 abstract class Abstraction {protected Implementor imple;protected Abstraction(Implementor imple){this.imple=imple;}public abstract void Operation(); } //擴展抽象化角色 class RefinedAbstraction extends Abstraction {protected RefinedAbstraction(Implementor imple){super(imple);}public void Operation(){System.out.println("擴展抽象化(Refined Abstraction)角色被訪問" );imple.OperationImpl();} } //測試類 public class BridgeTest {public static void main(String[] args){Implementor imple=new ConcreteImplementorA();Abstraction abs=new RefinedAbstraction(imple);abs.Operation();} } //測試結果 擴展抽象化(Refined Abstraction)角色被訪問 具體實現化(Concrete Implementor)角色被訪問畫筆實現
四、優缺點
優點:
-
分離抽象接口及其實現部分。
-
橋接模式有時類似于多繼承方案,但是多繼承方案違背了類的單一職責原則(即一個類只有一個變化的原因),復用性比較差,而且多繼承結構中類的個數非常龐大,橋接模式是比多繼承方案更好的解決方法。
-
橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
-
實現細節對客戶透明。
缺點:
-
橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。
-
橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用范圍具有一定的局限性。
五、使用場景
-
如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
-
對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
-
一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
六、典型應用
JDBC
String sql = "具體要操作的sql語句"; // 1:裝載驅動 Class.forName("驅動的名字"); // 2:創建連接 Connection conn = DriverManager.getConnection("連接數據庫服務的URL", "用戶名","密碼"); // 3:創建statement或者是preparedStatement PreparedStatement pstmt = conn.prepareStatement(sql); // 4:執行sql,如果是查詢,再獲取ResultSet ResultSet rs = pstmt.executeQuery(sql); // 5:循環從ResultSet中把值取出來,封裝到數據對象中去 while (rs.next()) { // 取值示意,按名稱取值 String uuid = rs.getString("uuid"); // 取值示意,按索引取值 int age = rs.getInt(2); } //6:關閉 rs.close(); pstmt.close(); conn.close();我們寫的應用程序,是面向JDBC的API在開發,這些接口就相當于橋接模式中的抽象部分的接口。JDBC的驅動程序實現了JDBC的API,驅動程序就相當于橋接模式中的具體實現部分。DriverManager來把它們橋接起來,從某個側面來看,DriverManager在這里起到了類似于簡單工廠的功能。
該例子詳情可見:https://www.jianshu.com/p/af6b1b27f638
介紹了廣義橋接模式和更多其他模式對比
七、對比
策略模式
相同點:
- 在橋接模式中,Abstraction通過聚合的方式引用Implementor。
在策略模式中,Context也使用聚合的方式引用Startegy抽象接口。 - 在這兩種模式中,都存在一個對象使用聚合的方式引用另一個對象的抽象接口的情況,而且該抽象接口的實現可以有多種并且可以替換。可以說兩者在表象上都是調用者與被調用者之間的解耦,以及抽象接口與實現的分離。
不同點:
-
在形式上,在橋接模式中不僅Implementor具有變化(ConcreateImplementior),而且Abstraction也可以發生變化(RefinedAbstraction),且兩者的變化是完全獨立的,RefinedAbstraction與ConcreateImplementior之間松散耦合,它們僅僅通過Abstraction與Implementor之間的關系聯系起來。而在策略模式中,并不考慮Context的變化,只有算法的可替代性。
-
在語意上,橋接模式強調Implementor接口僅提供基本操作,而Abstraction則基于這些基本操作定義更高層次的操作。而策略模式強調Strategy抽象接口的提供的是一種算法,一般是無狀態、無數據的,而Context則簡單調用這些算法完成其操作。
適配器模式
相同點:
- 讓兩個東西配合工作,且和對象適配器模式一樣,都存在一個類調用另一個類。
不同點:
- 假如A適配B(只針對對象的適配器),以及A橋接B
- 時機:適配是在A,B都早已實現的情況下,而橋接反之,設計之初就要考慮
- 動機:適配是A為了滿足B接口的需求封裝自己迎合B,橋接是AB兩個維度共同組合成一個實體。
裝飾器模式
相同點:
- 使得兩者可以獨立變化??梢詼p少派生類的增長
不同點:
- 裝飾是實現與實現之間的動態組合
- 橋接是抽象與實現的分離
總結
以上是生活随笔為你收集整理的GOF设计模式之桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php实现飘窗,JS实现网站图片飘窗效果
- 下一篇: docker部署python web应用