【設計模式深度剖析】【5】【結構型】【橋接模式】| 以電視和遙控器為例加深理解

👈?上一篇:組合模式

設計模式-專欄👈?

目 錄

  • 橋接模式(Bridge Pattern)
  • 定義
    • 英文原話是:
    • 直譯
    • 理解
  • 4個角色
    • UML類圖
    • 代碼示例
  • 應用
    • 優點
    • 缺點
    • 使用場景
  • 示例解析:電視和遙控器
    • UML類圖

橋接模式(Bridge Pattern)

定義

英文原話是:

  • Bridge Pattern is a software design pattern that is used to overcome the limitations of the traditional inheritance.
  • It decouples an abstraction from its implementation so that the two can vary independently.
  • The bridge pattern consists of two parts: abstraction and implementation.
  • The abstraction part defines the interface that the client uses to interact with the system.
  • The implementation part implements the abstraction by providing the functionality required by the client.

直譯

  • 橋接模式是一種用于克服傳統繼承局限性的軟件設計模式。
  • 它將抽象部分與實現部分解耦,使得兩者可以獨立地變化
  • 橋接模式由兩部分組成:抽象部分和實現部分。
    • 抽象部分定義了客戶端與系統交互的接口。
    • 實現部分通過提供客戶端所需的功能來實現抽象部分。

理解

橋接模式(Bridge Pattern)從字面上理解,可以想象成一個橋梁連接了兩個不同的部分,使得這兩個部分可以相互通信或協作,而不需要彼此之間有直接的依賴關系。在軟件設計中,這兩個部分通常指的是抽象部分和實現部分。

在橋接模式中,抽象部分定義了一個接口(或抽象類),用于定義抽象層的行為。實現部分則實現了這個接口,提供了具體實現。這兩個部分通過組合的方式關聯在一起,而不是繼承。這樣做的好處是,抽象部分和實現部分可以獨立變化,只要它們遵循相同的接口規范。

橋接模式的主要目的是通過組合的方式建立抽象與實現之間的聯系,而不是通過繼承。

這允許開發人員在不修改抽象接口的情況下修改實現,從而提高了系統的靈活性和可擴展性。

同時,橋接模式也避免了多重繼承可能帶來的問題,如違背類的單一職責原則和降低復用性等。

4個角色

橋接模式(Bridge Pattern)是一種結構型設計模式,它將抽象部分與它的實現部分分離,使得它們可以獨立地變化。這種類型的設計模式屬于結構型模式,它通過提供抽象層和實現層之間的橋接結構,來實現二者的解耦。

UML類圖

在這里插入圖片描述

橋接模式包含以下四個角色:

  1. 抽象化(Abstraction)角色:定義抽象類的接口,并保存一個對實現化對象的引用。
  2. 擴展抽象化(RefinedAbstraction)角色:抽象化角色的子類,實現它要求的業務邏輯,并通過組合關系調用實現化角色中的業務方法。
  3. 實現化(Implementor)角色:這個接口定義了實現化角色的接口,但不提供具體的實現。這個接口必須被實現化角色的具體類來實現。
  4. 具體實現化(ConcreteImplementor)角色:實現化角色接口的具體實現類。

代碼示例

以下是一個Java示例來演示橋接模式:

package com.polaris.designpattern.list2.structural.pattern5.bridge.classicdemo;// 實現化角色接口
interface Implementor {  void operationImpl();  
}  // 具體實現化角色  
class ConcreteImplementorA implements Implementor {  @Override  public void operationImpl() {  System.out.println("操作A的實現");  }  
}  class ConcreteImplementorB implements Implementor {  @Override  public void operationImpl() {  System.out.println("操作B的實現");  }  
}  // 抽象化角色  
abstract class Abstraction {  protected Implementor implementor;  public Abstraction(Implementor implementor) {  this.implementor = implementor;  }  public abstract void operation();  
}  // 擴展抽象化角色  
class RefinedAbstraction extends Abstraction {  public RefinedAbstraction(Implementor implementor) {  super(implementor);  }  @Override  public void operation() {  // 在調用實現化角色的方法之前或之后,可以添加一些邏輯  System.out.println("擴展操作前...");  implementor.operationImpl();  System.out.println("擴展操作后...");  }  
}  // 客戶端代碼  
public class BridgePatternDemo {  public static void main(String[] args) {  Implementor implementorA = new ConcreteImplementorA();  Abstraction abstraction = new RefinedAbstraction(implementorA);  abstraction.operation();System.out.println("-----------");Implementor implementorB = new ConcreteImplementorB();  abstraction = new RefinedAbstraction(implementorB);  abstraction.operation();  }  
}/* Output:
擴展操作前...
操作A的實現
擴展操作后...
-----------
擴展操作前...
操作B的實現
擴展操作后...
*///~

在這個例子中,Implementor 是實現化角色接口,ConcreteImplementorAConcreteImplementorB 是兩個具體實現化角色。Abstraction 是抽象化角色,它持有一個對實現化角色的引用,而 RefinedAbstraction 是擴展抽象化角色,它擴展了 Abstraction 的功能。客戶端代碼通過組合關系,將實現化角色和抽象化角色組合在一起,實現了二者的解耦。

應用

再來總結下,橋接模式(Bridge Pattern)是一種結構型設計模式,它通過將抽象部分與實現部分解耦,使得它們可以獨立地變化。

橋接模式通常用于以下情況:

  1. 抽象和實現需要獨立變化:當抽象部分和實現部分都需要獨立擴展時,可以使用橋接模式。例如,不同的數據庫系統(抽象部分)可能需要不同的驅動程序(實現部分)。
  2. 需要跨多個平臺實現:當系統需要在不同的平臺上運行時,可以使用橋接模式來封裝平臺相關的代碼。
  3. 避免繼承層次過深:當使用繼承來實現多個維度的變化時,可能會導致繼承層次過深,使得代碼難以理解和維護。橋接模式通過組合代替繼承,可以解決這個問題。

優點

  1. 分離抽象與實現:橋接模式將抽象部分與實現部分分離,使得它們可以獨立地變化。這增加了系統的靈活性和可擴展性。
  2. 減少繼承層次:通過組合關系替代繼承關系,減少了繼承層次,降低了系統的復雜度。
  3. 支持動態切換實現:在運行時,可以動態地切換實現部分,而不需要修改抽象部分的代碼。
  4. 符合開閉原則:橋接模式符合開閉原則,即對擴展開放,對修改封閉。當需要添加新的實現時,只需要添加新的實現類,而不需要修改已有的代碼。

缺點

  1. 增加了系統的復雜性:由于引入了抽象部分和實現部分兩個層次,增加了系統的復雜性。對于簡單的系統來說,可能不需要使用橋接模式。
  2. 可能增加了系統開銷:在運行時,需要維護抽象部分和實現部分之間的關聯關系,這可能會增加一些額外的開銷。

使用場景

以下是一些適合使用橋接模式的場景:

  1. 多種操作系統:當軟件需要在多種操作系統上運行時,可以使用橋接模式來封裝與操作系統相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的操作系統。
  2. 多種數據庫系統:當軟件需要與多種數據庫系統進行交互時,可以使用橋接模式來封裝與數據庫相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的數據庫系統。
  3. 多種圖形用戶界面:當軟件需要支持多種圖形用戶界面(如Windows、Mac、Linux等)時,可以使用橋接模式來封裝與界面相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的界面風格。
  4. 多種網絡協議:當軟件需要與多種網絡協議進行通信時,可以使用橋接模式來封裝與網絡協議相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的網絡協議。

示例解析:電視和遙控器

在生活中,一個常見的橋接模式的例子是電視和遙控器。

電視(抽象化角色)提供了觀看節目的基本功能,而遙控器(實現化角色)則負責控制電視的不同操作(如換臺、調節音量等)。

電視本身不關心遙控器是如何實現的,只要它符合一定的接口規范(如紅外信號、藍牙等)。

同樣,遙控器也可以控制不同類型的電視,只要電視也符合相應的接口規范。

UML類圖

在這里插入圖片描述

下面是一個簡化的代碼示例,用于說明這個場景:

package com.polaris.designpattern.list2.structural.pattern5.bridge.remotecontroldemo;//遙控器接口(Implementor)
interface RemoteControl {//換臺void changeChannel(int channel);//調節音量void adjustVolume(int volume);// ... 其他控制方法  
}//具體遙控器(ConcreteImplementor)  
class InfraredRemoteControl implements RemoteControl {@Overridepublic void changeChannel(int channel) {System.out.println("使用紅外遙控器換臺到: " + channel);}@Overridepublic void adjustVolume(int volume) {System.out.println("使用紅外遙控器調節音量到: " + volume);}// ... 實現其他控制方法  
}//電視抽象類(Abstraction) 
abstract class Television {protected RemoteControl remoteControl;public Television(RemoteControl remoteControl) {this.remoteControl = remoteControl;}public abstract void turnOn();public abstract void turnOff();// 使用遙控器來控制電視  public void watch() {System.out.println("正在看電視...");remoteControl.changeChannel(10); // 假設切換到10頻道  remoteControl.adjustVolume(50); // 假設調節音量到50  }
}//具體電視類(RefinedAbstraction) 
class LEDTelevision extends Television {public LEDTelevision(RemoteControl remoteControl) {super(remoteControl);}@Overridepublic void turnOn() {System.out.println("LED電視已打開");}@Overridepublic void turnOff() {System.out.println("LED電視已關閉");}
}//客戶端代碼  
public class BridgePatternDemo {public static void main(String[] args) {// 創建一個紅外遙控器  RemoteControl infraredRemote = new InfraredRemoteControl();// 創建一個LED電視,并使用紅外遙控器  Television ledTv = new LEDTelevision(infraredRemote);ledTv.turnOn(); // 打開電視  ledTv.watch(); // 使用遙控器觀看電視  ledTv.turnOff(); // 關閉電視  }
}/* Output:
LED電視已打開
正在看電視...
使用紅外遙控器換臺到: 10
使用紅外遙控器調節音量到: 50
LED電視已關閉
*///~

在這個例子中,Television 是抽象化角色,它定義了電視的基本操作(如打開、關閉),并持有對 RemoteControl(遙控器)的引用。LEDTelevision 是擴展抽象化角色,它擴展了電視的基本功能,并提供了具體的實現。RemoteControl 是實現化角色接口,定義了遙控器需要實現的方法。InfraredRemoteControl 是具體實現化角色,它實現了紅外遙控器的功能。

客戶端代碼創建了一個 InfraredRemoteControl 對象和一個 LEDTelevision 對象,并將遙控器對象傳遞給電視對象。這樣,電視就可以通過遙控器來控制自己的行為了。

這個例子展示了橋接模式如何使得抽象化角色(電視)和實現化角色(遙控器)可以獨立地變化。


上一篇:組合模式👈?

設計模式-專欄👈?

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

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

相關文章

band對應頻段列表(2G、4G、5G)

5G BAND對應頻段 n1:2.1G n3:1.8 n5:850 n8:900 n28:700 n41:2.6G n77:3.3G n78:3.5G n79:4.9G n257、258、260:毫米波頻段(26G,28G,39G) 4G BAND對應頻段 Band1:2.1G–上行1920-1980 MHz,下行2110-2170 MHz Band3:1.8G–上行1710-1785 MH…

CC工具箱使用指南:【淹沒區分析(BHM)】

一、簡介 群友定制工具。 這個工具適用面比較小。 工具的應用場景如下: 提供一個淹沒區范圍,類型是面要素。統計這個范圍內的一些線、面要素的面積或長度。 給定的幾個數據有:耕地、永久基本農田、房臺、道路(線)…

基于Docker搭建屬于你的CC++集成編譯環境

常常,我會幻想著擁有一個隨時可以攜帶、隨時可以使用的開發環境,那該是多么美好的事情。 在工作中,編譯環境的復雜性常常讓我頭疼不已。稍有不慎,刪除了一些關鍵文件,整個編譯鏈就會瞬間崩潰。更糟糕的是,…

【Go語言入門學習筆記】Part6.包和兩個幾乎用不到的小Tip

一、前言 這個文章簡單了寫了一下包、init函數、匿名函數。 二、學習代碼 1.包 package packTestimport "fmt"func init() { //如果主函數引用了這個包,主函數執行的時候會先執行包的initfmt.Println("hello world") }func Add(num1 int, num…

如何保養和維護氣膜體育館—輕空間

隨著經濟的飛速發展,氣膜體育館以其新穎的外觀、優美的造型、節能環保的特點,迅速進入體育市場。然而,對于氣膜體育館的維護和保養是不容忽視的問題,必須引起重視。下面我們將詳細介紹氣膜體育館的維護需要從哪些方面著手。 一、保…

公路行業交通工程乙級資質的動態考核要點

技術人員保持與更新: 核查技術人員的在職狀態、專業資格證書的有效性,以及新增或離職技術人員的情況,確保關鍵崗位人員的穩定性和資質要求的持續達標。評估技術人員的專業發展,包括繼續教育、培訓和參與專業活動的情況&#xff0c…

【電路筆記】-狀態可變濾波器

狀態可變濾波器 文章目錄 狀態可變濾波器1、概述2、**狀態可變濾波器電路**3、狀態可變濾波器示例4、陷波濾波器設計5、總結狀態可變濾波器是一種多反饋濾波器電路,可以從同一單個有源濾波器設計中同時產生所有三種濾波器響應:低通、高通和帶通。 1、概述 狀態可變濾波器使用…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 新聞資訊 的設計與實現

一.項目介紹 本系統分為 后端 和 小程序端 后端:點擊登錄按鈕 設置個人中心、 管理員賬號數據維護、 基礎數據維護、 短視頻信息維護(包括查看短視頻留言、短視頻收藏)、 論壇維護(增刪改查帖子信息,包括查…

Rabbit MQ學習之《基礎概念》

Message Queue 1 什么是MQ MQ(message queue),本質是個隊列,FIFO 先入先出,只不過隊列中存放的內容是message而已,同時是一種跨進程的通信機制,用于上下游傳遞消息。 在互聯網架構中,MQ 是一種非常常見的…

深入解析力扣166題:分數到小數(模擬長除法與字符串操作詳解及模擬面試問答)

力扣166題:分數到小數 在本篇文章中,我們將詳細解讀力扣第166題“分數到小數”。通過學習本篇文章,讀者將掌握如何使用多種方法來解決這一問題,并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋和ASCII圖解&am…

鋇錸技術BL205模塊在智能制造產線的靈活配置與優化

鋇錸技術的OPC UA耦合器BL205模塊在智能制造產線中的靈活配置與優化是當今工業領域中的一個關鍵議題。隨著工業4.0和數字化轉型的不斷推進,生產線的靈活性和智能化程度成為了企業追求的目標。在這一背景下,BL205模塊以其分布式、可插拔、結構緊湊、可編程…

【Python快速上手(三十三)】- Python operator 模塊

目錄 Python快速上手(三十三)- Python operator 模塊Python operator 模塊詳解1. 模塊簡介2. 算術運算符函數3. 比較運算符函數4. 位運算符函數5. 序列操作函數6. 方法調用函數7. 操作函數對象8. 實際應用案例9. 小結 Python快速上手(三十三&…

Java基礎入門day57

day57 JSP、Servlet&#xff0c;Java bean和JDBC整合項目 index.jsp頁面 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <!DOCTYPE html> <html> <head><title>JSP - Hello World</title> …

CSS 媒體查詢 響應式開發

介紹 媒體查詢&#xff08;Media Queries&#xff09;是CSS3的技術&#xff0c;可以根據設備的特性&#xff08;如屏幕寬度、高度、方向等&#xff09;來應用不同的樣式規則。媒體查詢可以使網頁在不同設備上呈現不同的樣式&#xff0c;以實現響應式設計。 語法 media scree…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加載預訓練模型參數對不齊和收到意外參數報錯解決方案

使用mmdetection時遇到的問題比較多&#xff0c;首先要對自己要使用的預訓練模型有一定的了解&#xff0c;并且懂得使用各種分類模型時不同的模型不同任務執行階段需要參數上的對其。&#xff08;比如mask-rcnn和它的三個頭之間的參數&#xff09;。 首先&#xff0c;談談torc…

什么是聲明式事務管理?

聲明式事務管理是Spring提供的一種事務管理機制&#xff0c;它允許開發者通過聲明的方式&#xff0c;而不是通過編程的方式&#xff0c;來管理事務的邊界和行為。在聲明式事務管理中&#xff0c;你可以通過注解或XML配置來指定方法或類上的事務屬性和行為。 在Spring中&#x…

Spring Boot集成六大常用中間件,附集成源碼,親測有效

目錄 萬字論文&#xff0c;從0到1&#xff0c;只需1小時獲取途徑1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

JavaEE(入門)

JavaEE &#xff08;詳細注釋版&#xff09; 1. 入門基礎 1.1 JavaEE簡介 JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;是由Sun Microsystems推出的一套標準&#xff0c;現由Oracle維護。JavaEE平臺主要用于開發和運行企業級應用程序&#xff0c;具有高…

11 Goroutine-并發與并行、阻塞與非阻塞

并發 順序執行&#xff1a;按照事先計劃好的順序&#xff0c;執行完一個操作后&#xff0c;再執行下一個操作。 順序執行效率不高的原因&#xff1a; 每個操作由多個步驟組成&#xff0c;每個步驟所需要的時間長短不一&#xff0c;有些步驟可能相當耗時。顧客點菜需要時間&a…

VectorDBBench在windows的調試

VectorDBBench在windows的調試 VectorDBBench是一款向量數據庫基準測試工具&#xff0c;支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等&#xff0c;可以測試其QPS、時延、recall。 VectorDBBench是一款使用python編寫的…