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