學習技術的過程老是須要慢慢積累的,因此持續學習是一個一直存在的事情。很高興,我能一直經過看書輸出設計模式相關的系列,也很感謝各位朋友的持續關注。java
廢話很少說啦,今天咱們繼續學習一個對於Android開發來講可能不太陌生的模式,適配器模式和外觀模式。曾經或者如今正在作Android開發的你,是否是很熟悉這個呢?對的,Android裏不少控件,可都是須要適配器來處理的噢,那咱們趕忙進來看看吧。設計模式
適配器是什麼,你必定不難理解,由於現實就存在。比方說,若是你須要在歐洲國家使用美國製造的筆記本電腦,你可能須要使用一個交流電的適配器...它的工做是將歐式插座轉換成美式插座,好讓美式插頭能夠插進這個插座獲得電力。學習
這就是真實世界的適配器,那面向對象適配器又是什麼?其實,適配器和真實世界的適配器扮演着一樣的角色:將一個接口轉換成另外一個接口,以符合客戶的指望。用一個形象點的圖表示就是:測試
有了前面的鋪墊,咱們來看下下面這個場景。若是它走起路來像只鴨子,叫起來像只鴨子,你以爲他必定是一隻鴨子嗎?如今這個答案就未必是確定的回答了,它多是一隻包裝了鴨子適配器的火雞。this
結合第一章的鴨子的例子,咱們在這裏好好利用起來。先來看看鴨子接口和類的一個稍微簡化的版本:設計
// 葉子實現了Duck接口,具有呱呱叫和飛行的能力 public interface Duck { public void quack(); public void fly(); }
綠頭鴨是鴨子的子類:code
public class MallardDuck implements Duck { public void quack() { System.out.println("Quack"); } public void fly() { System.out.println("I'm flying"); } }
這裏爲您介紹最新的「街頭頑禽」:對象
// 火雞不會呱呱叫,只會咯咯叫 public interface Turkey { public void gobble(); public void fly(); } // 火雞的具體實現 public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble"); } public void fly() { System.out.println("I'm flying a short distance"); } }
正常狀況下,是按照上面的流程來就行了。可是如今若是你缺乏鴨子對象,想用一些火雞對象來冒充。可是兩個根本不是同一個東西,怎麼冒充呢?適配器模式的威力就來了。blog
// 首先,你須要實現想轉換成的類型接口,也就是你的客戶所指望看到的接口 public class TurkeyAdapter implements Duck { Turkey turkey; // 接着,須要取得適配器的對象引用 public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } // 咱們須要實現接口中的方法。quack()在類之間的轉換,只須要調用gobble便可 public void quack() { turkey.gobble; } public void fly() { for(int i = 0; i < 5; i++) { turkey.fly(); } } }
public class DuckTestDrive { public static void main(String[] args) { // 建立一隻鴨子 MallardDuck duck = new MallardDuck(); // 建立一隻火雞 WildTurkey turkey = new WildTurkey(); // 將火雞包裝進一個火雞的適配器中,使他看起來像一隻鴨子 Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println("The Turkey says..."); // 測試這隻火雞 turkey.gobble(); turkey.fly(); // 測試鴨子,傳入一個鴨子對象 System.out.println("\nThe Duck says..."); testDuck(duck); System.out.println("\nThe TurkeyAdapter says..."); // 重點在這,咱們傳入一個僞裝是鴨子的火雞 testDuck(turkeyAdapter); } static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
看了上面的例子,是否是以爲適配器很神奇呢。經過以假換真的方式實現了火雞帶鴨子的功能。那咱們來看下,究竟是怎麼一回事接口
客戶使用適配器的過程以下:
玩夠了鴨子、火雞和交流電適配器,如今讓咱們進入真實世界,並看看適配器模式的正式定義:
適配器模式將一個類的接口,轉換成客戶指望的另外一個接口,適配器讓本來接口不兼容的類能夠合做無間。
轉換成類圖就是:
這個適配器模式充滿着良好的OO設計原則:使用對象組合,以修改的接口包裝被適配者;這種作法還有額外的優勢,那就是,被適配者的任何子類,均可以搭配着適配器使用。
也請留意,這個模式是如何把客戶和接口綁定起來,而不是和實現綁定起來的。咱們可使用數個適配器,每個都負責轉換不一樣組的後臺類。或者,也能夠加上新的實現,只要它們遵循目標接口就能夠。
哈哈,講到這裏適配器模式差很少就介紹完了。小編曾經寫Android的時候,都不知道適配器是啥東西,只知道盲目的使用。學了設計模式,終於知道適配器是幹嗎 用的了。Andorid世界裏,那麼多須要使用適配器的控件,你如今清楚了嗎?
下次咱們將介紹外觀模式,咱們下次再會。
愛生活,愛學習,愛感悟,愛挨踢