圖解Java設計模式之橋接模式

来源:https://www.cnblogs.com/haizai/archive/2020/03/21/12540294.html
-Advertisement-
Play Games

圖解Java設計模式之橋接模式 手機操作問題 傳統方案解決手機操作問題 傳統方案解決手機操作問題分析 橋接模式(Bridge)-基本介紹 橋接模式解決手機操作問題 橋接模式在JDBC中的源碼解析 橋接模式的註意事項和細節 橋接模式其它應用場景 手機操作問題 現在對不同手機類型的不同品牌實現操作編程( ...


圖解Java設計模式之橋接模式

 

手機操作問題

現在對不同手機類型的不同品牌實現操作編程(比如 :開機、關機、上網、打電話等等),如圖 :
在這裡插入圖片描述

傳統方案解決手機操作問題

傳統方法對應的類圖
在這裡插入圖片描述

傳統方案解決手機操作問題分析

1)擴展性問題(類爆炸),如果我們再增加手機的樣式(旋轉式),就需要增加各個品牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。
2)違反類單一職責原則,當我們增加手機樣式時,要同時增加所有品牌的手機,這樣增加類代碼維護成本。
3)解決方案 - 使用橋接模式

橋接模式(Bridge)-基本介紹

1)橋接模式(Bridge 模式)是指 : 將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。
2)是一種結構型設計模式
3)Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行為實現(Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴展。
在這裡插入圖片描述
說明 :
1)Client類 :橋接模式的調用者。
2)抽象類(Abstraction) :維護了Implementor / 即它的實現類ConcreteImplementorA…,二者是聚合關係,Abstraction充當橋接類。
3)RefinedAbstraction :是Abstraction抽象類的子類。
4)Implementor :行為實現類的介面
5)ConcreteImplementor A/ B : 行為的具體實現類
6)從UML圖 :這裡的抽象類和介面是聚合的關係,其實調用和被調用關係

橋接模式解決手機操作問題

使用橋接模式改進傳統方式,讓程式具有很好的擴展性,利用程式維護
1)應用實例和前面一樣
2)使用橋接模式對應的類圖
在這裡插入圖片描述

package com.example.demo.bridge;

/**
 * 介面
 * @author zhaozhaohai
 *
 */
public interface Brand {

	void open();
	void close();
	void call();
}
package com.example.demo.bridge;

public class Vivo implements Brand{

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手機開機");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手機關機");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手機打電話");
	}

}
package com.example.demo.bridge;

public class XiaoMi implements Brand{

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("小米手機開機");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println("小米手機關機");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("小米手機打電話");
	}

}
package com.example.demo.bridge;

public abstract class Phone {

	/**
	 * 組合品牌
	 */
	private Brand brand;
	
	public Phone(Brand brand) {
		this.brand = brand;
	}
	
	protected void open() {
		this.brand.open();
	}
	
	protected void close() {
		this.brand.close();
	}
	
	protected void call() {
		this.brand.call();
	}
}
package com.example.demo.bridge;

/**
 * 摺疊式手機類,繼承抽象類Phone
 * @author zhaozhaohai
 *
 */
public class FoldedPhone extends Phone{

	public FoldedPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}
	public void open() {
		super.open();
		System.out.println(" 摺疊樣式手機 ");
	}
	
	public void close() {
		super.close();
		System.out.println(" 摺疊樣式手機 ");
	}
	
	public void cell() {
		super.call();
		System.out.println(" 摺疊樣式手機 ");
	}
}
package com.example.demo.bridge;

public class UpRightPhone extends Phone{

	public UpRightPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}
	
	public void open() {
		super.open();
		System.out.println(" 直立樣式手機 ");
	}
	
	public void close() {
		super.close();
		System.out.println(" 直立樣式手機 ");
	}
	
	public void cell() {
		super.call();
		System.out.println(" 直立樣式手機 ");
	}

}
package com.example.demo.bridge;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 獲取摺疊式手機(樣式 + 品牌)
		Phone phone1 = new FoldedPhone(new XiaoMi());
		phone1.open();
		phone1.call();
		phone1.close();
		
		Phone phone2 = new FoldedPhone(new Vivo());
		phone2.open();
		phone2.call();
		phone2.close();
		
		Phone phone3 = new UpRightPhone(new XiaoMi());
		phone3.open();
		phone3.call();
		phone3.close();
	}

}

橋接模式在JDBC中的源碼解析

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

橋接模式的註意事項和細節

1)實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。
2)對於系統的高層部分,只需要知道抽象部分和實現部分的介面就可以了,其它部分由具體業務來完成。
3)橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
4)橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和編程
5)橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍有一定的局限性,即需要有這樣的應用場景。

橋接模式其它應用場景

1)對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用
2)常見的應用場景 :
JDBC驅動程式
銀行轉賬系統 :
轉賬分類 : 網上轉賬,櫃臺轉賬,AMT轉賬(抽象)
轉賬用戶類型 :普通用戶,銀卡用戶,金卡用戶(實現)
消息管理
消息類型 :即時消息,延時消息(抽象)
消息分類 :手機簡訊,郵件消息,QQ消息(實現)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JS排序演算法之快排和歸併 [Toc] 快速排序 原理: 選擇一個key(一般是第一個元素), 將數組劃分為兩個區域. 左邊全部區域小於等於key, 右邊全部大於key. 然後在通過這種方法將每個區域劃分為兩個區域. 整個過程可以遞歸實現,以此實現整個數據有序 + 時間複雜度: O(n log(n)) ...
  • 效果 貼上效果展示: 實現思路 樣式方面不多贅述,滾動區域是給固定高度,設置 來實現。 接下來看看js方面的實現,其實也很簡單,觸發的條件是: + = 。例子我會使用 來實現,和原生實現是一樣的。 可視高度(offsetHeight):通過 的 獲得,表示區域固定的高度。這裡我推薦通過 來獲取高度, ...
  • 為什麼要三次握手:① 防止失效的鏈接到達伺服器伺服器打開錯誤鏈接。② 客戶端如果長時間等待,會有一個超時重傳,但是之前那個被耽誤的請求還是會回到伺服器,伺服器會打開兩個連接。③ 有三次握手後客戶端會忽視滯留請求。 為什麼要四次揮手。 ① 當客戶端發送連接釋放報名後,伺服器端數據可能還沒有傳輸完。 為 ...
  • 淺拷貝 定義:直接將一個引用數據類型的地址,賦值給另一個變數存儲,兩個變數存儲的是相同的記憶體地址,在一個變數操作數據,另一個變數中的數據也會改變 案例: 總結: a給b賦值時是給的記憶體地址,兩個變數中的數據改變隨意一個變數的數據,另外一個變數中的數據也跟著改變,這種操作就被稱為淺拷貝 深拷貝 定義: ...
  • JavaScript進階之高階函數篇 簡介:歡迎大家來到woo爺說前端;今天給你們帶來的是JavaScript進階的知識,接下來的系列都是圍繞著JavaScript進階進行闡述;首先我們第一篇講的是高階函數。 高階函數定義:高階函數是指操作函數的函數;一般情況在項目開發過程中都會分兩種情況 函數可以 ...
  • JavaScript 中函數原型是實現繼承的基礎。prototype、construct、原型鏈以及基於原型鏈的繼承是面向對象的重要內容 ...
  • 故事背景: 沙雕在公司一個開放API團隊工作,平時的工作內容主要是做一些對外API項目開發,負責跟第三方系統對接。雖然工作也幾年了,但是一直都是按照上級做好的設計文檔和分配的任務去做,很少自己去做設計和思考。有一天團隊老大跑路了,部門老闆想提拔他做團隊老大的工作,但需要負責一個新項目架構設計工作來試 ...
  • 策略模式(Strategy):它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化不會影響到使用演算法的客戶。 ——《大話設計模式》 策略模式主要用來解決當有多種相似演算法的時,使用if...else產生的難以維護的問題。它主要由三部分組成:Strategy介面、具體的Strate ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...