100、23種設計模式之適配器模式(9/23)

適配器模式(Adapter Pattern) 是一種結構型設計模式,它允許將不兼容的接口轉換為客戶端期望的接口,使原本由于接口不兼容而不能一起工作的類可以協同工作。

一、核心思想

  • 將一個類的接口轉換成客戶期望的另一個接口
  • 使原本因接口不匹配而無法一起工作的類能夠一起工作
  • 屬于"包裝器"(Wrapper)設計模式的一種

二、適用場景

1.需要使用現有類,但其接口與需求不匹配
2.想要復用一些現有的子類,但這些子類缺少一些公共功能
3.需要與多個不兼容的接口或庫一起工作

三、適配器模式在 C# 中的實現

1. 類適配器(使用繼承)

// 目標接口(客戶端期望的接口)
public interface ITarget
{void Request();
}// 被適配者(現有的不兼容類)
public class Adaptee
{public void SpecificRequest(){Console.WriteLine("Adaptee's SpecificRequest() called");}
}// 類適配器(通過多重繼承實現)
public class ClassAdapter : Adaptee, ITarget
{public void Request(){// 將目標接口方法轉換為被適配者的方法base.SpecificRequest();}
}// 客戶端代碼
class Program
{static void Main(){ITarget target = new ClassAdapter();target.Request(); // 輸出: Adaptee's SpecificRequest() called}
}

2. 對象適配器(使用組合)

// 目標接口
public interface ITarget
{void Request();
}// 被適配者
public class Adaptee
{public void SpecificRequest(){Console.WriteLine("Adaptee's SpecificRequest() called");}
}// 對象適配器(通過組合實現)
public class ObjectAdapter : ITarget
{private readonly Adaptee _adaptee;public ObjectAdapter(Adaptee adaptee){_adaptee = adaptee;}public void Request(){// 將請求委托給被適配者_adaptee.SpecificRequest();}
}// 客戶端代碼
class Program
{static void Main(){Adaptee adaptee = new Adaptee();ITarget target = new ObjectAdapter(adaptee);target.Request(); // 輸出: Adaptee's SpecificRequest() called}
}

四、實際應用示例

示例:第三方支付系統適配

// 目標接口(系統期望的支付接口)
public interface IPaymentGateway
{void ProcessPayment(decimal amount);
}// 第三方支付系統(不兼容的接口)
public class ThirdPartyPaymentProcessor
{public void MakePayment(double amount){Console.WriteLine($"Processing payment of amount: {amount}");}
}// 適配器
public class PaymentAdapter : IPaymentGateway
{private readonly ThirdPartyPaymentProcessor _processor;public PaymentAdapter(ThirdPartyPaymentProcessor processor){_processor = processor;}public void ProcessPayment(decimal amount){// 將decimal轉換為double以適應第三方系統double convertedAmount = (double)amount;_processor.MakePayment(convertedAmount);}
}// 客戶端代碼
class Program
{static void Main(){var thirdPartyProcessor = new ThirdPartyPaymentProcessor();IPaymentGateway paymentGateway = new PaymentAdapter(thirdPartyProcessor);paymentGateway.ProcessPayment(99.99m);// 輸出: Processing payment of amount: 99.99}
}

五、適配器模式的優缺點

優點

  • 單一職責原則:將接口轉換代碼從業務邏輯中分離
  • 開閉原則:可以引入新的適配器而不影響現有代碼
  • 提高了類的復用性

缺點

  • 增加了系統復雜性(需要引入新的類和接口)
  • 在某些情況下,過度使用適配器會使系統變得難以維護

六、適配器模式與其他模式的關系

  • 與外觀模式:適配器包裝一個類,而外觀模式包裝整個子系統

  • 與橋接模式:兩者都旨在將抽象與實現解耦,但適配器關注已有接口的兼容性,橋接模式關注提前設計

  • 與裝飾器模式:適配器提供不同的接口,裝飾器提供擴展功能而不改變接口

七、最佳實踐

  • 當接口不兼容但功能相似時使用適配器模式
  • 優先使用對象適配器(組合方式)而非類適配器(繼承方式),因為更靈活
  • 考慮使用依賴注入來管理適配器的生命周期
  • 為適配器編寫單元測試以確保轉換邏輯正確

適配器模式在C#中特別適用于集成遺留系統、第三方庫或處理接口不匹配的情況,是構建可擴展、可維護系統的重要工具。
在這里插入圖片描述

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

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

相關文章

線上環境CPU使用率飆升,如何排查

線上環境CPU使用率飆升,如何排查 1.CPU飆升的常見原因 1. 代碼層面問題 死循環:錯誤的循環條件導致無限循環遞歸過深:沒有正確的終止條件算法效率低:O(n)或更高時間復雜度的算法處理大數據集頻繁GC:內存泄漏導致頻繁垃…

《sklearn機器學習——特征提取》

在 sklearn.feature_extraction 模塊中,DictVectorizer 是從字典(dict)中加載和提取特征的核心工具。它主要用于將包含特征名稱和值的 Python 字典列表轉換為機器學習算法所需的數值型數組或稀疏矩陣。 這種方法在處理結構化數據(…

IEEE出版,限時早鳥優惠!|2025年智能制造、機器人與自動化國際學術會議 (IMRA 2025)

2025年智能制造、機器人與自動化國際學術會議 (IMRA2025)2025 International Conference on Intelligent Manufacturing, Robotics, and Automation中國?湛江2025年11月14日-2025年11月16日IMRA2025權威出版大咖云集穩定檢索智能制造、人工智能、機器人、物聯網(Io…

C# 基于halcon的視覺工作流-章30-圓圓距離測量

C# 基于halcon的視覺工作流-章30-圓圓距離測量 本章目標: 一、利用圓卡尺找兩圓心; 二、distance_pp算子計算兩圓點距離; 三、匹配批量計算;本章是在章23-圓查找的基礎上進行測量使用,圓查找知識請閱讀章23&#xff0c…

java設計模式二、工廠

概述 工廠方法模式是一種常用的創建型設計模式,它通過將對象的創建過程封裝在工廠類中,實現了創建與使用的分離。這種模式不僅提高了代碼的復用性,還增強了系統的靈活性和可擴展性。本文將詳細介紹工廠方法模式的三種形式:簡單工廠…

Ubuntu 24.04 中 nvm 安裝 Node 權限問題解決

個人博客地址:Ubuntu 24.04 中 nvm 安裝 Node 權限問題解決 | 一張假鈔的真實世界 參考nvm的一個issue:https://github.com/nvm-sh/nvm/issues/3363 異常信息如下: $ nvm install 22 Downloading and installing node v22.19.0... Download…

Java面試-線程安全篇

一、synchronized關鍵字: 基本使用與作用:通過搶票代碼示例,展示了synchronized作為對象鎖,可避免多線程超賣或搶到同一張票問題,保證代碼原子性,同一時刻只有一個線程獲得鎖,其他線程阻塞。底層…

R 語言科研繪圖 --- 其他繪圖-匯總2

在發表科研論文的過程中,科研繪圖是必不可少的,一張好看的圖形會是文章很大的加分項。 為了便于使用,本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中,獲取方式: R 語言科研繪圖模板 --- sciRplothttps://mp.…

【數學建模學習筆記】啟發式算法:粒子群算法

零基礎小白看懂粒子群優化算法(PSO)一、什么是粒子群優化算法?簡單說,粒子群優化算法(PSO)是一種模擬鳥群 / 魚群覓食的智能算法。想象一群鳥在找食物:每只鳥(叫 “粒子”&#xff0…

【Gitlab】Ubuntu 20.04服務器部署Gitlab

寫一個 適用于 Ubuntu 20.04/22.04 的 GitLab 一鍵部署腳本,包括:安裝依賴安裝 GitLab CE配置公網 IP 或域名自動開啟 HTTPS(Let’s Encrypt)配置防火墻下面是完整腳本:#!/bin/bash# # GitLab 一鍵安裝腳本 # # 1. 檢…

Android 15重磅升級:16KB內存頁機制詳解與適配指南

一、背景隨著Android硬件架構的持續演進,新一代設備開始采用16KB內存頁(Page Size)機制,逐步替代傳統的4KB內存頁設計。此項底層變更對應用兼容性產生直接影響,特別是對依賴Native層庫、JNI接口或自定義內存管理模塊的…

Mybatis-8 動態SQL

動態SQL-官方文檔 文檔地址 動態 SQL_MyBatis中文網 為什么需要動態SQL 1、動態SQL是MyBatis的強大特性之一 2、使用JDBC或其它類似的框架,根據不同條件拼接SQL語句非常麻煩,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一…

PySpark數據輸入

PySpark數據輸入 1.理解RDD對象 2.掌握PySpark數據輸入的2種方法 RDD對象 PySpark支持多種數據的輸入,在輸入完成后,都會得到一個:RDD類的對象 RDD全稱為:彈性分布式數據集(Resilient Distributed Datasets&#xff09…

【系統架構設計(16)】軟件架構設計二:軟件架構風格:構建系統的設計模式與選擇指南

文章目錄一、核心思想二、數據流風格:以數據流動為核心的處理模式三、調用返回風格:基于程序調用的層次化組織四、獨立構件風格:基于事件驅動的松耦合架構五、虛擬機風格:提供抽象執行環境的架構模式六、倉庫風格:以數…

MySQL速記小冊(1)

1【Q】:Mysql中的數據排序是怎么實現的?【A】:排序過程中如果字段有索引,則利用索引排序。反之使用文件排序。在文件排序中,如果數據量少則在內存中排序,使用單路排序或雙路排序。如果數據量大則利于磁盤文…

20250904 10:45_排查10.1.3.35新QMS系統RMAN備份失敗問題(優化腳本里的環境配置,增加了check_oracle_env 函數)

一、RMAN備份失敗日志如下 [2025-09-04 04:00:01] 備份腳本啟動 [2025-09-04 04:00:01] 開始 RMAN 備份 CDB: ORCLCDB Message file RMAN<lang>.msb not found Verify that ORACLE_HOME is set properly [2025-09-04 04:00:01] RMAN 備份失敗! 二、原備份腳本存檔…

Vue3源碼reactivity響應式篇之EffectScope

概述 EffectScope是Vue3中一個響應式系統的輔助類&#xff0c;用于管理副作用&#xff08;effect&#xff09;的作用域。它可以幫助我們更好地組織和管理多個effect&#xff0c;便于一起停止或暫停以及恢復&#xff0c;避免了全局狀態的污染和管理的復雜性。 每一個vue組件的實…

MySQL 日志全解析:Binlog/Redo/Undo 等 5 類關鍵日志的配置、作用與最佳實踐

1 二進制日志&#xff08;Binlog&#xff09;&#xff1a;配置與核心作用 Binlog 是 MySQL 中跨存儲引擎的核心日志&#xff0c;記錄所有數據修改操作&#xff0c;主要用于主從復制、數據備份恢復與跨庫遷移。 1.1 Binlog 核心操作 開啟 Binlog 若需開啟 Binlog&#xff0c;需在…

springboot 之 HTML與圖片生成 (2)

前言 之前寫了一篇html轉圖片的 文章&#xff0c;使用中文時會出現亂碼情況&#xff0c;后來又從網上找了下信息&#xff0c;這篇主要介紹下另一個轉換庫。 依賴 <!-- 用于將html轉圖片--><dependency><groupId>gui.ava</groupId><artifactId>…

計算機組成原理:計算機的分類

&#x1f4cc;目錄&#x1f5a5;? 計算機組成原理&#xff1a;計算機的分類——從架構到應用的全景梳理一、按處理數據類型分類&#xff1a;從“數字”到“混合”的演進&#xff08;一&#xff09;數字計算機&#xff1a;離散數據的“精準管家”1. 核心原理2. 關鍵優勢3. 典型…