好比,如今一個沒有電的手機和一個110V50HZ的插座在你面前,你顯然要給手機充電,可是手機只須要5V-1A的輸入。這時候怎麼辦?設計模式
打電話給電廠,把電壓給我降下來app
找手機廠商,把個人手機改成220V的輸入框架
找個電源適配器ide
結果很顯然~spa
適配器用於鏈接兩種不一樣種類的對象,使其毫無問題的協同工做。思想很簡單,適配器實現客戶端所要的某種接口的行爲。同時,它又鏈接到另外一個具備(徹底)不一樣接口與行爲的對象。一邊是客戶端懂得如何使用的目標接口,另外一邊是客戶端一無所知的被適配者,適配器處於二者之間。適配器的主要做用是把被適配者的行爲傳遞給管道另外一端的客戶端。設計
已有類的接口與需求不符3d
想要一個可複用的類,該類可以同可能帶有不兼容接口的其餘類協做。代理
須要適配一個類的幾個不一樣子類,但是每個子類去子類化一個類適配器又不現實。那麼可使用對象適配器(也就是代理)來適配其父類的接口。指針
解耦(適配器裏作的事情,就是一個耦合的過程)code
類適配器與對象適配器是實現適配器模式的不一樣方式,可是達成了一樣的目的。
類適配器 | 對象適配器 |
---|---|
只針對單一的具體Adaptee類,把Adaptee適配到Target | 能夠適配多個Adaptee及其子類 |
易於重載Adaptee的行爲,由於是經過直接的子類化進行的適配 | 難以重載Adaptee的行爲,須要藉助於子類的對象而不是Adaptee自己 |
只有一個Adapter對象,無需額外的指針間接訪問Adaptee | 須要額外的指針以間接訪問Adaptee並適配其行爲 |
Target(這是客戶所指望的接口。目標能夠是具體的或則抽象的類
,也能夠是接口
)
class Target { public virtual void Request() { Console.WriteLine("普通請求"); } }
Adaptee(須要適配的類)代碼以下:
class Adaptee { public void SepecificRequest() { Console.WriteLine("特殊請求"); } }
Adapter(經過在內部包裝一個Adaptee對象,把源接口轉換成目標接口),代碼以下:
class Adapter : Target { private Adaptee adaptee = new Adaptee(); public override void Request() { adaptee.SepecifiRequest(); } }
客戶端端代碼以下:
static void Main(String[] args) { Target target = new Adapter(); target.Request(); Console.Read(); }
以UITableView的使用爲例:想要把UITableView的接口變換成客戶端須要的接口。
這裏的客戶端是什麼呢?其實就是UITableView。
那麼此處什麼是Target(目標接口)呢?是一個UITableViewDelegate和UITableViewDataSource。
實現協議的具體類(UIViewController)會是個適配器。那什麼是與框架不匹配而須要適配的類呢——應用程序(UIViewController)中的其餘類。
咱們之因此說委託機制主要是適配器模式,是由於委託機制能夠實現某些其餘設計模式的意圖,好比裝飾模式。委託模式的實現有時會跟其餘設計模式混在一塊兒。
適配器模式的有點不少,如:
將客戶端與適配者解耦、使客戶端調用更加簡明(只須要調用定義的接口方法)。
但一樣也有缺點
在寫適配器的時候爲適應目標接口,可能會有比較複雜實現過程;
無故端多出許多的類,使結構又複雜了一些。