設計模式學習筆記(十六:橋接模式)

来源:http://www.cnblogs.com/liuzhen1995/archive/2016/11/05/6034311.html
-Advertisement-
Play Games

1.1概述 將抽象部分與它的實現部分分離,使他們都可以獨立地變化。這就是橋接模式的定義。 抽象類或介面中可以定義若幹個抽象方法,習慣上將抽象方法稱作操作。抽象類或介面使程式的設計者忽略操作的細節,即不必考慮這些操作是如何實現的,當用戶程式面向抽象類或介面時,就不會依賴具體的實現,使系統具有很好的擴展 ...


1.1概述

    將抽象部分與它的實現部分分離,使他們都可以獨立地變化。這就是橋接模式的定義。

    抽象類或介面中可以定義若幹個抽象方法,習慣上將抽象方法稱作操作。抽象類或介面使程式的設計者忽略操作的細節,即不必考慮這些操作是如何實現的,當用戶程式面向抽象類或介面時,就不會依賴具體的實現,使系統具有很好的擴展性。但是,抽象類中的抽象方法總歸是需要子類去實現的,在大多數情況下抽象類的子類完全可以勝任這樣的工作,但是在某些情況下,子類可能會遇到一些難以處理的問題。

  例如,電視臺系統中有一個抽象類CCTV,該類有一個抽象方法abstract void makeProgram()。現在為了滿足某些用戶看電視劇的需求,這裡給出了CCTV類的子類:CCTV8,該類的實例調用makeProgram()方法製作電視劇節目,因此子類CCTV8必須實現父類的makeProgram()方法,比如使用該方法製作出若幹幀影像。子類CCTV8makeProgram()方法在製作出第一幀影像後,比如在第一幀影像顯示“CCTV8”,馬上就發現以下兩個問題:

(1)從第2幀開始應當是電視劇中的影像,而這樣的影像不應當由CCTV8類的makeProgram()方法負責製作。

(2)如果CCTV8makeProgram()方法中強行給出了第2幀以後的各個影像,那麼用戶使用CCTV8類的實例看到的電視劇是一個固定的電視劇,如果有其他用戶想看新的電視劇,系統就必須新增新的CCTV子類,這對電視臺系統是一個非常不合理的一種設計,因為CCTV類應當只有一個負責製作“電視劇”節目的子類:CCTV8,而不是多個,也就是說,不能因為一個新的用戶要看不同的電視劇,就要出現一個專門為該用戶製作“電視劇”節目的子類。

  針對上述問題,應當將實現和抽象放在兩個不同的類層次中,從而使他們可獨立的改變,即將一個抽象類中抽象方法的重要實現部分交給另外一個抽象類的子類或實現另外一個介面的類。比如,對於上述問題,應當將makeProgram()方法的實現交給另外一個抽象類:Program,該類定義了製作影像的makeTVfilm()方法。

  我們應當重新設計抽象類CCTV類,使該類包含Program的引用,這就可以使CCTV類的子類CCTV8在實現makeProgram()方法時,將該方法的重要實現部分交給Program類的makeTVfilm()方法,即委托給Program子類的實例調用makeTVfilm()方法。

  我們稱CCTV類和Program類之間的關係是橋接關係,也即是說,CCTV類的子類CCTV8僅僅在CCTV類和Program類之間起到一個“橋接”的作用,具體類關係如下圖一所示:

 

圖一:電視節目與電視劇製作的橋接關係

 

 

1.2模式的結構

橋接模式包括以下四種角色:

(1)抽象(Abstration):是一個抽象類,該抽象類含有Implementor聲明的變數,即維護一個Implementor類型對象。

(2)實現者(Implementor):實現者角色是一個介面(抽象類),該介面(抽象類)中的方法不一定與Abstration類中方法一致。Implementor介面(抽象類)負責定義基本操作,而Abstration類負責定義基於這些基本操作的較高層次的操作。

(3)細化抽象(Refined Abstration):細化抽象是抽象角色的一個子類,該子類在重寫(覆蓋)抽象角色中的抽象方法時,在給出一些必要的操作後,將委托所維護Implementor類型對象調用相應的方法。

(4)具體實現者(Concrete Implementor):具體實現者是實現(擴展)Implementor介面(抽象類)的類。

橋接模式結構的類圖如下圖二所示:

 

圖二:橋接模式的類圖

 

1.3橋接模式的優點

(1)橋接模式分離實現與抽象,使抽象和實現可以獨立的擴展。當修改實現的代碼時,不影響抽象的代碼,反之也一樣。

(2)滿足開-閉原則。抽象和實現者處在同層次,使系統可獨立地擴展者兩個層次。增加新的具體實現者,不需要修改細化對象,反之增加新的細化對象也不需要修改具體實現。

 

1.4適合使用橋接模式的情景

1)不想讓抽象和某些重要的實現代碼是固定綁定關係,這部分實現可運行時動態決定。

2)抽象和實現者都可以繼承的方法獨立地擴充而互不影響,程式在運行期間可能需要動態的將一個抽象的子類的實例與一個實現者的子類的實例進行組合。

3)希望對實現者層次的代碼的修改對抽象層不產生影響,即抽象層的代碼不必重新編譯,反之亦然。


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

-Advertisement-
Play Games
更多相關文章
  • 一、前言 在之前的隨筆之中,我們已經瞭解Java通過上傳組件來實現上傳和下載,這次我們來瞭解Struts2的上傳和下載。 註意:文件上傳時,我們需要將表單提交方式設置為"POST"方式,並且將enctype屬性設置為"multipart/form-data",該屬性的預設值為"application ...
  • iText是著名的開放項目,是用於生成PDF文檔的一個java類庫。通過iText不僅可以生成PDF或rtf的文檔,而且可以將XML、Html文件轉化為PDF文件。 官方網站:http://itextpdf.com/ 示例版本:itextpdf-5.2.1.jar 示例代碼 document.add ...
  • 一、OOP(Object-oriented Programming)面向對象程式編程 初談類和對象,所謂萬物皆對象,類和對象有什麼區別和聯繫? 類,是對某一種類型的定義,比如字元串,動物,人,飛機等等,而對象是指具體的字元串,動物,人... 如:豬是類,定義了,豬,有體重,有年齡,可以吃飯,可以睡覺 ...
  • 英文文檔: 2. 當傳入多個可迭代對象時,函數的參數必須提供足夠多的參數,保證每個可迭代對象同一索引的值均能正確傳入函數。 3. 當傳入多個可迭代對象時,且它們元素長度不一致時,生成的迭代器只到最短長度。 4. map函數是一個典型的函數式編程例子。 ...
  • 在我的上一篇博客JVM-String比較-位元組碼分析中介紹了String字元串比較的原因,藉著分析位元組碼的機會,我這篇博客將會繪圖展現方法內部位元組碼執行過程。 話不多說,貼上我們將要分析的Java方法代碼: 再貼上我們將要分析的Java方法的位元組碼: 由Code:下麵的第一行,我們得知,操作數棧深度 ...
  • org.apache.commons.lang.StringUtils中常用的方法,這裡主要列舉String中沒有,且比較有用的方法: 1. 檢查字元串是否為空: static boolean isBlank(CharSequence str) 判斷字元串是否為空或null; static bool ...
  • 以下筆記內容來自尚矽谷_Struts2_佟剛老師的視頻教程+自己一點點整理 一、 1. VS 自實現: 1). 搭建 Struts2 的開發環境 2). 不需要顯式的定義 Filter, 而使用的是 struts2 的配置文件. 3). details.jsp 比先前變得簡單了。 屬性引用:${re ...
  • java允許在一個類中定義另外一個類,這就叫類嵌套。類嵌套分為兩種,靜態的稱為靜態嵌套類,非靜態的稱為內部類。 使用嵌套類的原因: 嵌套類也屬於類的成員,因此也可使用類成員的可視範圍控制修飾詞,內部類能夠使用其所在類的其他類成員,而靜態嵌套類則不能使用其所在類的其他類成員。 靜態嵌套類 與靜態方法與 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...