[C# 設計模式] Adapter - 適配器模式(兩種)


Adapter - 適配器模式

  現實生活中,我們常用到適配器。

  你當前打開我這篇文章的筆記本電腦,電源的另一邊不正連着一塊適配器嗎?

  你平時想將三口插座插進二口插座里面,不也需要一個適配器嗎?

  整天插在插座上的手機充電頭,不也是一個適配器嗎?

 

目錄

  • 第一種:類適配器(使用繼承)
  • 第二種:對象適配器(使用委托)
  • 抽象的 UML 類圖

 

第一種:類適配器(使用繼承)

  這里,我假設家用功率為 220v,經過適配器,輸出為 18v,可供我的筆記本進行使用。

  類圖

 

  Portal(入口) 類:只有一個方法 Input(),來表示輸入的電流功率。

  IOutput(輸出)接口:只有一個方法 Output(),來表示經過轉換后輸出的電流功率。

  Adapter(適配器)類:實現了 IOutput 接口。

 

  Portal.cs 類

 1     /// <summary>
 2     /// 入口
 3     /// </summary>
 4     class Portal
 5     {
 6         private readonly string _msg;
 7 
 8         public Portal(string msg)
 9         {
10             _msg = msg;
11         }
12         
13         /// <summary>
14         /// 輸入(電流)
15         /// </summary>
16         public void Input()
17         {
18             Console.WriteLine(_msg + " --> 18v。");
19         }
20     }

  

  IOutput.cs 接口

1     interface IOutput
2     {
3         /// <summary>
4         /// 輸出(電流)
5         /// </summary>
6         void Output();
7     }

 

  Adapter.cs 類

 1     /// <summary>
 2     /// 適配器
 3     /// </summary>
 4     class Adapter : Portal, IOutput
 5     {
 6         public Adapter(string msg) : base(msg)
 7         {
 8         }
 9 
10         public void Output()
11         {
12             Input();
13         }
14     }

 

  Client.cs 類

 1     class Client
 2     {
 3         static void Main(string[] args)
 4         {
 5             IOutput adapter = new Adapter("220v");
 6             adapter.Output();
 7 
 8             Console.Read();
 9         }
10     }

 

  客戶端在使用的過程中,我們只知道輸出的結果即可,內部實現不需要理會。

 

第二種:對象適配器(使用委托)

  委托:自己不想做的事,交給第三方去做。

  類圖

 

  Portal.cs 類

 1     /// <summary>
 2     /// 入口
 3     /// </summary>
 4     class Portal
 5     {
 6         private readonly string _msg;
 7 
 8         public Portal(string msg)
 9         {
10             _msg = msg;
11         }
12 
13         public void Input()
14         {
15             Console.WriteLine(_msg + " --> 18v");
16         }
17     }

 

  Adapter.cs 類

 1     class Adapter : Export
 2     {
 3         private readonly Portal _portal;
 4 
 5         public Adapter(string msg)
 6         {
 7             _portal = new Portal(msg);
 8         }
 9 
10         public override void Output()
11         {
12             _portal.Input();
13         }
14     }

 

  Export.cs 類

1     /// <summary>
2     /// 出口
3     /// </summary>
4     abstract class Export
5     {
6         public abstract void Output();
7     }

 

抽象的 UML 類圖

  4 種角色:Adaptee(被適配),Adapter(適配者),Client(使用場景),Target(目標對象)。

  Adaptee(被適配):不是 -er 結尾的哦,之前的 Portal(入口)類作為被適配者。

  Adapter(適配者):作為 Adaptee 和 Target 的媒介,進行調節。

  Client(使用場景):一個調用的入口,以 Main() 作為入口函數。

  Target(目標對象):調節(適配)后的輸出,之前的 IOutput 接口和 Export 類都是作為 Target 對象。

 

圖:類適配器(使用繼承)

圖:對象適配器(使用委托)

 

 

 C# 設計模式系列

  《Iterator - 迭代器模式:我與一份奧利奧早餐的故事

 

 


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6560899.html 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM