妙解設計模式之橋接模式

橋接模式的概念

橋接模式(Bridge Pattern)是一種結構型設計模式,用于將抽象部分和實現部分分離,使它們可以獨立變化。這種模式通過組合而不是繼承來實現這個目標,從而提高系統的靈活性和可擴展性。

  1. 抽象部分:定義抽象類,并包含一個對實現部分接口的引用。
  2. 實現部分:定義接口,具體的實現類實現這個接口。
  3. 分離:抽象部分和實現部分獨立變化,彼此之間沒有直接依賴關系。

為什么需要橋接模式?

  • 避免繼承層次過深:當類的繼承層次過深時,修改和擴展變得非常困難。橋接模式通過組合方式解決這個問題。
  • 提高靈活性:抽象和實現部分可以獨立地擴展,不會相互影響。
  • 遵循開閉原則:對擴展開放,對修改關閉。橋接模式使得我們在不修改現有代碼的基礎上進行擴展。

橋接模式的結構

  • Abstraction(抽象類):定義高層的控制邏輯,包含一個實現部分的引用。
  • RefinedAbstraction(擴充抽象類):擴展抽象類,提供具體的業務邏輯。
  • Implementor(實現接口):定義實現部分的接口,聲明實現類需要實現的方法。
  • ConcreteImplementor(具體實現類):實現實現接口,提供具體的實現。

生活中的例子

想象一下,你家里有很多種不同的電視機,比如索尼電視和三星電視。每個電視機都有不同的遙控器。這時候,你會覺得很麻煩,因為每次換電視機都要換遙控器。

如果我們能有一種萬能遙控器,不管電視機是什么品牌,只要有這個遙控器就能控制所有的電視機,那就方便多了。橋接模式就像這個萬能遙控器,讓我們可以用一個遙控器控制不同的電視機。

例子:玩具遙控車

假設我們有一個玩具遙控車系統,有不同的車子(紅色車、藍色車)和不同的遙控器(簡單遙控器、高級遙控器)。

定義車子

// 車子接口
interface Car {void drive();
}// 紅色車子
class RedCar implements Car {@Overridepublic void drive() {System.out.println("紅色車子在開");}
}// 藍色車子
class BlueCar implements Car {@Overridepublic void drive() {System.out.println("藍色車子在開");}
}

定義遙控器

// 遙控器抽象類
abstract class RemoteControl {protected Car car;protected RemoteControl(Car car) {this.car = car;}public abstract void pressButton();
}// 簡單遙控器
class SimpleRemoteControl extends RemoteControl {public SimpleRemoteControl(Car car) {super(car);}@Overridepublic void pressButton() {car.drive();}
}// 高級遙控器
class AdvancedRemoteControl extends RemoteControl {public AdvancedRemoteControl(Car car) {super(car);}@Overridepublic void pressButton() {car.drive();System.out.println("高級遙控器還可以做更多的事情");}
}

測試

public class Main {public static void main(String[] args) {Car redCar = new RedCar();Car blueCar = new BlueCar();RemoteControl simpleRemote = new SimpleRemoteControl(redCar);simpleRemote.pressButton(); // 紅色車子在開RemoteControl advancedRemote = new AdvancedRemoteControl(blueCar);advancedRemote.pressButton(); // 藍色車子在開,高級遙控器還可以做更多的事情}
}

編程中的例子

假設我們在做一個圖形繪制程序,支持繪制不同形狀(如圓形和矩形),并且這些形狀可以有不同的顏色(如紅色和藍色)。

我們可以使用橋接模式來實現,這樣就能讓形狀和顏色獨立變化,增加新的形狀或顏色時不需要修改現有代碼。

定義顏色接口(實現部分)

// 顏色接口
interface Color {void applyColor();
}// 紅色實現
class RedColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color.");}
}// 藍色實現
class BlueColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying blue color.");}
}

定義形狀抽象類(抽象部分)

// 抽象類:形狀
abstract class Shape {protected Color color;protected Shape(Color color) {this.color = color;}public abstract void draw();
}

擴展具體的形狀類(擴展抽象部分)

// 圓形
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("Drawing Circle in ");color.applyColor();}
}// 矩形
class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridepublic void draw() {System.out.print("Drawing Rectangle in ");color.applyColor();}
}

優點

  1. 獨立變化:我們可以獨立地增加新的顏色(如綠色、黃色)或新的形狀(如三角形),而無需修改現有的代碼。
  2. 靈活組合:形狀和顏色可以自由組合,形成各種不同的組合方式。
  3. 易于擴展:遵循開閉原則,對擴展開放,對修改關閉。

軟件工程中的實際應用

橋接模式在軟件工程中有很多實際應用,特別是當我們需要在兩個或多個維度上擴展一個系統時。

1.圖形繪制系統

在圖形繪制系統中,形狀和顏色是兩個獨立變化的維度。使用橋接模式可以讓形狀和顏色獨立變化。我們之前的例子已經展示了這一點。

2.數據庫驅動程序

在數據庫應用中,不同的數據庫(如MySQL、PostgreSQL、Oracle)有不同的連接方式和查詢方式。橋接模式可以將數據庫連接和查詢抽象出來,使得應用程序可以獨立地切換數據庫而不需要大量修改代碼。

// 實現接口:數據庫連接
interface DatabaseConnection {void connect();
}// 具體實現類:MySQL連接
class MySQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connecting to MySQL Database.");}
}// 具體實現類:PostgreSQL連接
class PostgreSQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connecting to PostgreSQL Database.");}
}// 抽象類:數據庫操作
abstract class DatabaseOperation {protected DatabaseConnection connection;protected DatabaseOperation(DatabaseConnection connection) {this.connection = connection;}public abstract void execute();
}// 具體操作類:查詢操作
class QueryOperation extends DatabaseOperation {public QueryOperation(DatabaseConnection connection) {super(connection);}@Overridepublic void execute() {connection.connect();System.out.println("Executing query operation.");}
}// 測試橋接模式
public class Main {public static void main(String[] args) {DatabaseConnection mysqlConnection = new MySQLConnection();DatabaseOperation queryOperation = new QueryOperation(mysqlConnection);queryOperation.execute(); // Connecting to MySQL Database. Executing query operation.DatabaseConnection postgresqlConnection = new PostgreSQLConnection();queryOperation = new QueryOperation(postgresqlConnection);queryOperation.execute(); // Connecting to PostgreSQL Database. Executing query operation.}
}

3.文件系統抽象

在處理文件系統時,我們可能需要支持本地文件系統、遠程文件系統、云存儲等。橋接模式可以將文件操作與具體的文件系統實現分離。

// 實現接口:文件系統
interface FileSystem {void readFile(String path);void writeFile(String path, String content);
}// 具體實現類:本地文件系統
class LocalFileSystem implements FileSystem {@Overridepublic void readFile(String path) {System.out.println("Reading file from local file system: " + path);}@Overridepublic void writeFile(String path, String content) {System.out.println("Writing file to local file system: " + path);}
}// 具體實現類:云存儲文件系統
class CloudFileSystem implements FileSystem {@Overridepublic void readFile(String path) {System.out.println("Reading file from cloud file system: " + path);}@Overridepublic void writeFile(String path, String content) {System.out.println("Writing file to cloud file system: " + path);}
}// 抽象類:文件操作
abstract class FileOperation {protected FileSystem fileSystem;protected FileOperation(FileSystem fileSystem) {this.fileSystem = fileSystem;}public abstract void performRead(String path);public abstract void performWrite(String path, String content);
}// 具體操作類:文件讀寫操作
class ReadWriteOperation extends FileOperation {public ReadWriteOperation(FileSystem fileSystem) {super(fileSystem);}@Overridepublic void performRead(String path) {fileSystem.readFile(path);}@Overridepublic void performWrite(String path, String content) {fileSystem.writeFile(path, content);}
}// 測試橋接模式
public class Main {public static void main(String[] args) {FileSystem localFileSystem = new LocalFileSystem();FileOperation fileOperation = new ReadWriteOperation(localFileSystem);fileOperation.performRead("local_path.txt"); // Reading file from local file system: local_path.txtfileOperation.performWrite("local_path.txt", "content"); // Writing file to local file system: local_path.txtFileSystem cloudFileSystem = new CloudFileSystem();fileOperation = new ReadWriteOperation(cloudFileSystem);fileOperation.performRead("cloud_path.txt"); // Reading file from cloud file system: cloud_path.txtfileOperation.performWrite("cloud_path.txt", "content"); // Writing file to cloud file system: cloud_path.txt}
}

4.用戶界面主題

在用戶界面開發中,不同的控件(如按鈕、文本框)可以有不同的主題(如淺色主題、深色主題)。橋接模式可以將控件和主題分離,使得它們可以獨立變化。

// 實現接口:主題
interface Theme {void applyTheme();
}// 具體實現類:淺色主題
class LightTheme implements Theme {@Overridepublic void applyTheme() {System.out.println("Applying light theme.");}
}// 具體實現類:深色主題
class DarkTheme implements Theme {@Overridepublic void applyTheme() {System.out.println("Applying dark theme.");}
}// 抽象類:控件
abstract class UIComponent {protected Theme theme;protected UIComponent(Theme theme) {this.theme = theme;}public abstract void display();
}// 具體控件類:按鈕
class Button extends UIComponent {public Button(Theme theme) {super(theme);}@Overridepublic void display() {System.out.print("Displaying button with ");theme.applyTheme();}
}// 具體控件類:文本框
class TextBox extends UIComponent {public TextBox(Theme theme) {super(theme);}@Overridepublic void display() {System.out.print("Displaying textbox with ");theme.applyTheme();}
}// 測試橋接模式
public class Main {public static void main(String[] args) {Theme lightTheme = new LightTheme();UIComponent button = new Button(lightTheme);button.display(); // Displaying button with Applying light theme.Theme darkTheme = new DarkTheme();UIComponent textBox = new TextBox(darkTheme);textBox.display(); // Displaying textbox with Applying dark theme.}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37250.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用C++進行文件讀寫操作

在C中&#xff0c;我們可以使用標準庫中的 <fstream>&#xff08;文件流&#xff09;來進行文件的讀寫操作。以下是一些基本的文件讀寫操作的示例。 讀取文件 cpp復制代碼 #include <fstream> #include <iostream> #include <string> int main() { s…

MySQL高級-SQL優化- update 優化(盡量根據主鍵/索引字段進行數據更新,避免行鎖升級為表鎖)

文章目錄 0、update 優化1、創建表2、默認是行鎖3、行鎖升級為表鎖4、給name字段建立索引 0、update 優化 InnoDB的行鎖是針對索引加的鎖&#xff0c;不是針對記錄加的鎖&#xff0c;并且該索引不能失效&#xff0c;否則會從行鎖升級為表鎖。 1、創建表 create table course(…

【嚴正聲明】鑒于CSDN的流氓行為,現已清空所有文章,資源下載分統一改為0

【嚴正聲明】鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 鑒于CSDN的流氓行為&#xff0c;現已清空所有文章&#xff0c;資源下載分統一改為0 如果你在C…

CUDA 編程

## blocksize和gridsize設置 使用deviceQuery查看GPU相關信息(下圖為1080 ti)blocksize的最大值建議不要超過Maximum number of threads per block&#xff08;1024&#xff09;由于每個block里的線程需要被分為數個wrap&#xff0c;而wrap size為32&#xff08;Warp size&…

搭建企業內網pypi鏡像庫,讓python在內網也能像互聯網一樣安裝pip庫

目錄 知識點實驗1.服務器安裝python2.新建一個目錄/mirror/pip&#xff0c;用于存儲pypi文件&#xff0c;作為倉庫目錄3.下載python中的所需包放至倉庫文件夾/mirror/pip3.1. 新建requirement.py腳本&#xff08;將清華pypi鏡像庫文件列表粘貼到requirement.txt文件中&#xff…

【MATLAB源碼-第231期】基于matlab的polar碼編碼譯碼仿真,對比SC,SCL,BP,SCAN,SSC等譯碼算法誤碼率。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 極化碼&#xff08;Polar Code&#xff09; 極化碼&#xff08;Polar Code&#xff09;是一種新型的信道編碼技術&#xff0c;由土耳其裔教授Erdal Ar?kan在2008年提出。極化碼在理論上被證明能夠在信道容量上達到香農極限…

成熟ICT測試系統與LabVIEW定制開發的比較

ICT&#xff08;In-Circuit Test&#xff09;測試系統是電子制造行業中用于電路板&#xff08;PCB&#xff09;組件檢測的重要工具。市場上有許多成熟的ICT測試系統&#xff0c;如Keysight、Teradyne、SPEA等公司提供的商用解決方案。此外&#xff0c;LabVIEW作為一種強大的圖形…

單目操作符

目錄 ! --- 邏輯反操作 & --- 取地址操作符 * --- 間接訪問操作符&#xff08;解引用操作符&#xff09; sizeof --- 操作數的類型長度&#xff08;單位為字節&#xff09; ~ --- 對一個數的補碼二進制按位取反 前置和前置-- 后置和后置-- (類型) --- 強制類型轉換…

three.js場景三元素

three.js是一個基于WebGL的輕量級、易于使用的3D庫。它極大地簡化了WebGL的復雜細節&#xff0c;降低了學習成本&#xff0c;同時提高了性能。 three.js的三大核心元素&#xff1a; 場景&#xff08;Scene&#xff09; 場景是一個三維空間&#xff0c;是所有物品的容器。可以將…

安卓速度下載v1.0.5/聚合短視頻解析下載

功能特色 短視頻下載與高級管理 – 支持短視頻下載&#xff0c;為您提供一系列高級視頻管理功能包括視頻內容提取、智能防重復技術、視頻體積壓縮以及視頻轉換成GIF圖片等&#xff1b; 磁-力鏈接下載升級 – 現支持磁力鏈接下載&#xff0c;實現邊下載邊播放的便捷體驗&#x…

構建基于LLMs混合型大模型的先進事實性問答系統架構

1.引言 傳統搜索系統基于關鍵字匹配&#xff0c;缺少對用戶問題理解和答案二次處理能力。本文探索使用大語言模型&#xff08;Large Language Model, LLM&#xff09;&#xff0c;通過其對自然語言理解&#xff08;Natural Language Understanding&#xff0c;NLU&#xff09;…

阿里云常用的操作

阿里云常見的產品和服務 容器服務 可以查看容器日志、監控容器cpu和內存&#xff0c; 日志服務 SLS 可以查看所有服務的日志&#xff0c; Web應用防火墻 WAF 可以查看 QPS. 阿里云查看集群&#xff1a; 點擊 “產品和服務” 中的 容器服務&#xff0c;可以查看 集群列表&…

linux server下人臉檢測與識別服務程序的系統架構設計

一、緒論 1.1 定義 1.2 研究背景及意義 1.3 相關技術綜述 二、人臉檢測與識別技術概述 2.1 人臉檢測原理與算法 2.2 人臉識別技術及方法 2.3 人臉識別過程簡介 三、人臉檢測與識別服務程序的系統架構 3.1 系統架構設計 3.2 技術實現流程 四、后續設計及經驗瞎談 4.…

解釋Java中的抽象類、接口、重載和重寫等核心概念

Java中的抽象類、接口、重載和重寫等核心概念詳解 在Java編程中&#xff0c;抽象類、接口、重載和重寫是面向對象編程的四個核心概念。這些概念不僅構成了Java編程語言的基礎&#xff0c;也是面試官在面試過程中經常考察的要點。下面&#xff0c;我將從技術難點、面試官關注點…

字符串

對應練習題&#xff1a;力扣平臺 14. 最長公共前綴 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string strs1strs[0];//初始前綴字符串for (int i 1; i < strs.size(); i) {while(strs[i].find(strs1)!0)//遍歷找到共同最長前…

第五節:如何使用其他注解方式從IOC中獲取bean(自學Spring boot 3.x的第一天)

大家好&#xff0c;我是網創有方&#xff0c;上節我們實踐了通過Bean方式聲明Bean配置。咱們這節通過Component和ComponentScan方式實現一個同樣功能。這節實現的效果是從IOC中加載Bean對象&#xff0c;并且將Bean的屬性打印到控制臺。 第一步&#xff1a;創建pojo實體類studen…

Android進階之路 - DialogFragment有沒有了解的必要?

幾個月前寫到了彈框業務&#xff0c;以前經常用Dialog、ButtomDialog 、popupWindow 組件&#xff0c;為了契合項目結構參考了原有的 DialogFragment 組件&#xff0c;特此予以記錄 我一般在項目中寫彈框組件的話&#xff0c;主要用到 alertDialog、popupWindow 組件&#xff0…

面試經驗分享 | 滲透測試工程師(實習崗)

所面試的公司&#xff1a;某安全廠商 所在城市&#xff1a;南京 面試職位&#xff1a;滲透測試工程師實習崗位 面試過程&#xff1a; 騰訊會議&#xff08;視頻&#xff09; 面試過程&#xff1a;整體流程就是自我介紹加上一些問題問題balabalabala。。。由于面的崗位是滲透…

用GPT-4糾錯GPT-4 OpenAI推出CriticGPT模型

根據OpenAI周四&#xff08;6月27日&#xff09;發布的新聞稿&#xff0c;該公司新推出了一個基于GPT-4的模型——CriticGPT&#xff0c;用于捕獲ChatGPT代碼輸出中的錯誤。CriticGPT的作用相當于讓人們用GPT-4來查找GPT-4的錯誤。該模型可以對ChatGPT響應結果做出批評評論&…

有沒有能用藍牙的游泳耳機,性能超凡的4大游泳耳機力薦

在現代科技的推動下&#xff0c;越來越多具備藍牙功能的游泳耳機正在改變游泳愛好者的體驗方式。這些創新產品不僅在防水性能上有了顯著提升&#xff0c;還能讓您在水中享受到高質量的音樂。然而&#xff0c;選擇一款優秀的藍牙游泳耳機并不簡單&#xff0c;需要考慮到防水等級…