設計模式(七): 通過轉接頭來觀察"適配器模式"(Adapter Pattern)

来源:http://www.cnblogs.com/ludashi/archive/2016/04/28/5408991.html
-Advertisement-
Play Games

在前面一篇博客中介紹了“命令模式”(Command Pattern),今天博客的主題是“適配器模式”(Adapter Pattern)。適配器模式用處還是比較多的,如果你對“適配器模式”理解呢,那麼自然而然的就會知道其使用場景。今天這篇博客我們就舉一個生活中的使用適配器模式的示例,然後將該示例使用代 ...


在前面一篇博客中介紹了“命令模式”(Command Pattern),今天博客的主題是“適配器模式”(Adapter Pattern)。適配器模式用處還是比較多的,如果你對“適配器模式”理解呢,那麼自然而然的就會知道其使用場景。今天這篇博客我們就舉一個生活中的使用適配器模式的示例,然後將該示例使用代碼進行表示出來,那麼我們所實現的代碼使用的設計模式就是我們今天所說的“適配器模式”。

“適配器”其實說白了就是一個轉接頭,比如Mac Book Pro 要接外接顯示器,如果你沒有HDMI傳輸線的話,那麼你就得使用轉接頭作為中間件來連接外接顯示器。你觀察各種“轉接頭”他們都有一個共同的特點,就是轉接頭兩端的介面肯定是不一樣的。其實上面我說了句廢話了,如果轉接頭的兩端一致那麼就是傳輸線了就不是轉接頭了。其實我們今天所要介紹的“適配器模式”就來源生活中的各種適配器。適配器說白了,其職責就是將一種介面轉換成另一種介面。下方是生活中常見的適配器。

    

上面說這麼多了,那麼讓我們來看一下“適配器模式”的定義吧,下方是適配器模式的定義:

適配器模式:將一個類的介面,轉換成客戶期望的另一個介面。適配器讓原本介面不相容的類可以合作無間

接下來我們就拿生活中的一個示例來真正的感受一下適配器模式。作為一個Programer你肯定使用過筆記本電腦,在此就使用MacBook Pro的電源適配器來做類比。MacBook Pro中接入外接電源時需要電源適配器的,接下來我們就使用代碼來實現插座,適配器以及MacBook Pro和其自帶電池間的關係。

 

一、電源適配器中的類圖

接下來我們將給出MacBook Pro電源適配器中的使用代碼表示的類圖,也就是我們使用“適配器模式”來設計電源適配器時所使用的類圖。下方就是我們所使用的類圖,總體看來下方的類圖分為三個模塊,左邊的紅框是我們的插座,中間的黃框是我們的電源適配器,右邊的綠框就是我們經常使用的筆記本電腦了。在筆記本電腦中帶有電池,MacBook Pro使用自帶電池是不需要適配器的,因為該電池在設計之初就是為其設計的。但是如果MacBook Pro的電池沒有電了,我們就需要為其接入外部電源。因為外部電源是多種多樣的,電壓電流都有所不同,不能直接給MacBook Pro供電,所以需要電源適配器來為MacBook Pro供電。下圖中黃色的就是我們的電源適配器,也是適配器模式的核心。依次給出了每個模塊的的介紹,如下所示:

在下方類圖中的紅色部分就是我們模擬插座的模塊。在該模塊中含有一個SocketType協議,該協議是Socket(插座)的一種規範,在此我們可以暫且理解為插座的國標。其中定義了插座的統一規範,只給出了聲明沒有實現(只給出了插座的尺寸,沒有給出如何生產插座)。我們要實現的Socket都遵循於SocketType協議,也就是說在中國生產的插座要符合中國國標,在美國生產的插座當然要符合美國的國標,當然這兩者的插座標準有可能是一樣的。紅框中就模擬了我們的插座。

接下來我們來看一下綠框中的內容。綠框中就是我們的MacBook Pro,其中也有個協議,名為ComputerPowerSourceType。該協議是筆記本電腦

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

-Advertisement-
Play Games
更多相關文章
  • 函數是一種功能上的抽象,比如當我們寫一段程式,這個程式多次用到了發送郵件的功能(比如說:每天三點固定發送郵件,每當伺服器負載較重發送郵件提醒……),那麼我們就可以將發送郵件這個功能抽象出來,單獨對其定義一個函數進行實現。這樣在需要引用發送郵件功能的時候,我們就不需要重覆複製代碼,直接調用函數就可以了 ...
  • 註:文章原文為Dr. Charles Severance 的 《Python for Informatics》。文中代碼用3.4版改寫,併在本機測試通過。 一旦利用程式通過HTTP協議獲得並分析文檔變得簡單,那麼開發生成一個特殊設計的、供其他程式使用的文檔(不是在瀏覽器中顯示HTML)的方法也不用花 ...
  • Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space. 代碼 ...
  • Echarts(3.x版)官網實例的數據都是靜態的,實際使用中往往會要求從伺服器端取數據進行動態顯示,官網教程里給出的非同步數據載入很粗略,下麵就以官網最簡單的實例為例子,詳細演示如下過程:1.客戶端通過ajax發送請求;2.伺服器端Servlet接收請求;3.生成json數據並返回給客戶端;4.客戶 ...
  • 之前寫過關於微信支付那些坑的文章(《微信JSApi支付~集成到MVC環境後的最後一個坑(網上沒有這種解決方案)》,《微信JSApi支付~坑和如何填坑》),下麵說一下微信官方提供的"掃碼支付",一配置,一運行,生成了一個二維碼,手機一掃,出現了"獲取商戶訂單信息超時或商戶返回httpcode非200" ...
  • 裝飾者模式(Decorator):動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾者模式比生成子類更為靈活。 1.定義介面,可以動態的給對象添加職責。 2.實現這個介面 3.裝飾類 4.具體實現的裝飾類 5.測試用例: 6.運行結果: ...
  • 依賴倒轉原則: A.高層模塊不應該依賴底層模塊,兩個都應該依賴抽象。 B.抽象不應該依賴細節,細節應該依賴抽象。 里氏代換原則: 子類型必須能夠替換掉他們的父類型。只有當子類可以替換掉父類,軟體單位的功能不受到影響時,父類才能真正被覆用,而子類也能過在父類的基礎上增加新的行為。只有子類型的可替換性才 ...
  • 開放-封閉原則,是說軟體實體(類,模塊,函數等)應該可以擴展,但是不可以修改的。換句話說就是,這個原則有兩大特征,對於擴展是開放的(Open for extension),另一個就是對於更改是封閉的(close for modification)。 但是,無論模塊多麼封閉都會存在一些無法對之封閉得到 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...