設計模式-結構型-適配器模式

来源:https://www.cnblogs.com/az4215/archive/2019/09/19/11538446.html
-Advertisement-
Play Games

適配器模式(Adapter Pattern): 將某個類的介面轉換成客戶端期望的另一個介面表示,主要的目的是相容性,讓原本因介面不匹配不能一起工作的兩個類可以協同工作。如讀卡器是作為記憶體卡和筆記本之間的適配器,需要將記憶體卡插入讀卡器,再將讀卡器插入筆記本,這樣筆記本就可以讀取記憶體卡了。 適配器模式的 ...


適配器模式(Adapter Pattern):

  將某個類的介面轉換成客戶端期望的另一個介面表示,主要的目的是相容性,讓原本因介面不匹配不能一起工作的兩個類可以協同工作。如讀卡器是作為記憶體卡和筆記本之間的適配器,需要將記憶體卡插入讀卡器,再將讀卡器插入筆記本,這樣筆記本就可以讀取記憶體卡了。

適配器模式的主要角色:

  

  1、目標介面(Target):當前系統業務所期待的介面,它可以是抽象類或介面。

  2、適配者類(Adaptee):被訪問和適配的現存組件庫中的組件介面。

  3、適配器類(Adapter):轉換器,通過繼承或引用適配者的對象,把適配者介面轉換成目標介面,讓客戶按目標介面的格式訪問適配者。

適配器模式主要分三類:類適配器模式、對象適配器模式、介面適配器模式(java中使用)。接下來我們來詳細介紹下這三種形式。

  1、類適配器模式

    當前去外地出差,工作繁忙,回到賓館也不得不工作。當你拿出電腦,準備接電源,卧槽...不支持!!!電源是兩孔的,而插座是三孔的,怎麼辦呢?你會想到去樓下小商店買個轉換插座,將三孔插座轉成兩孔的來用,簡直太聰明瞭。 

    (以該圖代替,原理類似)

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         Computer computer = new Computer(new TwoHoleSocket());
 6         computer.Connect();
 7         // 類適配器的缺點
 8         TwoHoleSocket twoHoleSocket = new TwoHoleSocket();
 9         twoHoleSocket.Test();
10     }
11 }
12 
13 internal class Computer
14 {
15     private readonly Transformer transformer;
16 
17     public Computer(Transformer transformer)
18     {
19         this.transformer = transformer;
20     }
21 
22     public void Connect()
23     {
24         transformer.Transfrom();
25         Console.WriteLine("連接成功!!!");
26     }
27 }
28 
29 /// <summary>
30 /// 三孔插座Adaptee
31 /// </summary>
32 internal class ThreeHoleSocket
33 {
34     public void Show()
35     {
36         Console.WriteLine("我是三孔插座");
37     }
38 
39     public void Test()
40     {
41         Console.WriteLine("我是多餘的");
42     }
43 }
44 
45 /// <summary>
46 /// 轉換器Target
47 /// </summary>
48 internal interface Transformer
49 {
50     void Transfrom();
51 }
52 
53 /// <summary>
54 ///  兩孔插座Adapter
55 /// </summary>
56 internal class TwoHoleSocket : ThreeHoleSocket, Transformer
57 {
58     public void Transfrom()
59     {
60         base.Show();
61         Console.WriteLine("轉換中。。。。");
62         Console.WriteLine("哈哈哈,我已經是兩孔插座");
63     }
64 }
view code

    分析:對於類適配器來說,Adapter與Adaptee過於耦合,增加了使用成本,且會暴露不必要的方法。

  2、對象適配器模式

    當手機沒電需要充電,你不可能直接使用220V的電壓,如果你真這麼做了,請註意人身安全及購買一臺新機。此時,充電器就起到了轉換器的作用,將220V電壓轉換成手機可使用的5V電壓。

    

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Phone phone = new Phone();
 6         phone.charging(new VoltageAdapter(new Voltage220V()));
 7     }
 8 }
 9 
10 class Phone
11 {
12     public void charging(Voltage5V voltage5V)
13     {
14         voltage5V.output5V();
15     }
16 }
17 
18 class Voltage220V
19 {
20     public void output220V()
21     {
22         Console.WriteLine("220V");
23     }
24 }
25 
26 interface Voltage5V
27 {
28     void output5V();
29 }
30 
31 class VoltageAdapter : Voltage5V
32 {
33     private readonly Voltage220V voltage220V;
34 
35     public VoltageAdapter(Voltage220V voltage220V)
36     {
37         this.voltage220V = voltage220V;
38     }
39 
40     public void output5V()
41     {
42         voltage220V.output220V();
43         Console.WriteLine("5V");
44     }
45 }
view code

    分析:以松耦合的方式實現適配器模式,推薦使用。   

  3、介面適配器模式(java中使用,c#中能夠實現但意義不大)

     

 1 class Program
 2 {
 3     static void Main(string[] agrs)
 4     {
 5         Power5VAdapter power5VAdapter = new Power5VAdapter(new AC220());
 6         Console.WriteLine(power5VAdapter.output5V());
 7     }
 8 }
 9 
10 class AC220
11 {
12     public int output220V()
13     {
14         int output = 220;
15         return output;
16     }
17 }
18 
19 interface Voltage
20 {
21     int output5V();
22     int output9V();
23     int output12V();
24     int output24V();
25 }
26 
27 abstract class PowerAdapter : Voltage
28 {
29     private readonly AC220 ac220;
30 
31     public PowerAdapter(AC220 ac220)
32     {
33         this.ac220 = ac220;
34     }
35 
36     public virtual int output12V()
37     {
38         return ac220.output220V();
39     }
40 
41     public virtual int output24V()
42     {
43         return ac220.output220V();
44     }
45 
46     public virtual int output5V()
47     {
48         return ac220.output220V();
49     }
50 
51     public virtual int output9V()
52     {
53         return ac220.output220V();
54     }
55 }
56 
57 class Power5VAdapter : PowerAdapter
58 {
59     private AC220 ac220;
60 
61     public Power5VAdapter(AC220 ac220)
62         : base(ac220)
63     {
64         this.ac220 = ac220;
65     }
66 
67     public override int output5V()
68     {
69         int output = 0;
70         if (this.ac220 != null)
71         {
72             output = this.ac220.output220V() / 44;
73         }
74         return output;
75     }
76 }
view code

優點:

  1、客戶端通過適配器可以透明地調用目標介面。

  2、復用了現存的類,開發人員不需要修改原有代碼而重用現有的適配者類。

  3、將目標類和適配者類解耦,解決了目標類和適配者類介面不一致的問題。

缺點:

  1、對類適配器來說,更換適配器的實現過程比較複雜。

  2、過多的適配器,會讓系統零亂,不易整體進行把握。


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

-Advertisement-
Play Games
更多相關文章
  • 場景 系統架構設計師考試,屬於全國電腦技術與軟體專業技術資格考試(簡稱電腦軟體資格考試)中的一個高級考試。 系統架構設計師考試,考試不設學歷與資歷條件,不論年齡和專業,考生可根據自己的技術水平,選擇合適的級別合適的資格,但一次考試只能報考一種資格。 實現 1 JG:第01章 考試簡介 2 JG: ...
  • 場景 Docker-Compose簡介與Ubuntu Server 上安裝Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100902301 Docker Compose基本使用-使用Compose啟動Tomcat ...
  • 每個人應該都訂閱了不少微信公眾號,那你有沒有註意到微信公眾號的消息呢?你訂閱的公眾號號主每發佈一篇文章,你都會主動的接收到文章的推送,並不需要你點開每個訂閱的公眾號一一查看有沒有更新,是不是覺得有點意思?感興趣?那就接著往下看吧,因為接下來我們要模擬公眾號群發的場景。 要模擬公眾號群發,首先需要簡單 ...
  • 最開始接觸AOP這個概念,是在大學Java課程中(具體哪本忘記了,JavaWeb?)接觸到的。當時的理解就是,一個請求過來,自上而下,突然從中間切一刀。從那個圖是這樣理解的,文字描述的都忘記了。關於AOP的博客有好多,在工作中需要用到,我也是看著博客,外加視頻學習來理解的。 http://wayfa ...
  • 一個對象的動作觸發多個對象的行為,通過觀察者可以去掉對象的依賴,支持各種自定義和擴展。 觀察者模式,還要從那隻申請的貓開始說起。 貓叫一聲之後觸發: Baby Cry()、Brother Trun()、Dog Wang()、Father Roar()、Mothor Whisper()、Mouse R ...
  • 適配器模式:解決重構的問題,新東西和舊系統不吻合,通過組合/繼承進行配 適配器:插座,電源適配器,做個轉接的 程式員已經確定好規範IHelper,新增了一個RedisHelper 第三方,二者規範不一致,就是沒實現介面 /// <summary> /// 數據訪問介面 /// </summary> ...
  • 抽象工廠:創建對象,創建一組密不可分的對象 創建產品簇,多個對象是個整體,不可分割 工廠+約束 傾斜的可擴展性設計,增加產品很麻煩 /// <summary> /// War3種族之一 /// </summary> public class Human : IRace { public Human( ...
  • 單例的基礎上升級了一下,把對象從記憶體層面複製了一下,然後返回。是個新對象,但是又不是new出來的。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...