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

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

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


手機操作問題

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

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

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

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

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消息(實現)


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

更多相關文章
  • 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 ...
一周排行
  • 一:背景 1. 講故事 曾今在項目中發現有同事自定義結構體的時候,居然沒有重寫Equals方法,比如下麵這段代碼: static void Main(string[] args) { var list = Enumerable.Range(0, 1000).Select(m => new Point ...
  • 最近一個朋友有個關於素數的小東西要寫一下,素數是什麼呢?除了1和他本身不能被其他數整除,那麼這個數就是素數,1除外哦。我們知道概念那就很簡單了,直接代碼擼起。 ...
  • 前言 在開發編程中,我們經常會遇到功能非常相似的功能模塊,只是他們的處理的數據不一樣,所以我們會分別採用多個方法來處理不同的數據類型。但是這個時候,我們就會想一個問題,有沒有辦法實現利用同一個方法來傳遞不同種類型的參數呢? 這個時候,泛型也就因運而生,專門來解決這個問題的。 泛型是在C 2.0就推出 ...
  • 本文章主要用於介紹在Asp.Net Mvc(C#)中使用Fleck製作一個Html5的即時聊天室,含有完整代碼和演示Demo。 ...
  • 出庫單的功能。能學習了出庫單管理之後,WMS的 主體功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的介面,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。 ...
  • Data StructureThere're two types of variables in C#, reference type and value type.Enum:enum Color{Red=0,Green=1}//equals to enum Color{Red,//start fr... ...
  • 0. 前言 該項目使用Maven進行管理和構建,所以需要預先配置好Maven。嗯,在這個系列里就不做過多的介紹了。 1. 創建項目 先創建一個pom.xml 文件,添加以下內容: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...
  • API 概述 API(Application Programming Interface),應用程式編程介面。 Java API是一本程式員的 字典 ,是JDK中提供給我們使用的類的說明文檔。 這些類將底層的代碼實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用即可。 所以我 ...
  • 女程式員是這麼徵婚的: SELECT * FROM 男人們 WHERE 未婚=true and 同性戀=false and 有房=true and 有車=true and 條件 in (帥氣,紳士,大度,氣質,智慧,溫柔,體貼,會浪漫,活潑,可愛,最好還能帶孩子) and 年齡 between(24 ...
  • 有很多剛學習軟體測試的小伙伴,都會在網路上找尋各種學習資料,去提升自己的專業技能水平。因此,我決定定期分享我整理收集的一些軟體測試的測試工具下載、面試寶典、視頻教學合集。都整理好了,有需要的可以關註我(獲取方式在文末) 軟體測試的學習,不止是基礎理論,還需要學習測試工具的用法,如介面工具Postma ...