設計模式之適配器模式與外觀模式(一)

學習技術的過程老是須要慢慢積累的,因此持續學習是一個一直存在的事情。很高興,我能一直經過看書輸出設計模式相關的系列,也很感謝各位朋友的持續關注。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();
    }
}

適配器模式解析

看了上面的例子,是否是以爲適配器很神奇呢。經過以假換真的方式實現了火雞帶鴨子的功能。那咱們來看下,究竟是怎麼一回事接口

客戶使用適配器的過程以下:

  1. 客戶經過目標接口調用適配器的方法對適配器發出請求
  2. 適配器使用被適配者接口請求轉換成被適配者的一個或多個調用接口
  3. 客戶接收到調用的結果,但並未察覺這一切是適配器在起轉換做用

定義適配器模式

玩夠了鴨子、火雞和交流電適配器,如今讓咱們進入真實世界,並看看適配器模式的正式定義:

適配器模式將一個類的接口,轉換成客戶指望的另外一個接口,適配器讓本來接口不兼容的類能夠合做無間。

轉換成類圖就是:

這個適配器模式充滿着良好的OO設計原則:使用對象組合,以修改的接口包裝被適配者;這種作法還有額外的優勢,那就是,被適配者的任何子類,均可以搭配着適配器使用

也請留意,這個模式是如何把客戶和接口綁定起來,而不是和實現綁定起來的。咱們可使用數個適配器,每個都負責轉換不一樣組的後臺類。或者,也能夠加上新的實現,只要它們遵循目標接口就能夠。

哈哈,講到這裏適配器模式差很少就介紹完了。小編曾經寫Android的時候,都不知道適配器是啥東西,只知道盲目的使用。學了設計模式,終於知道適配器是幹嗎 用的了。Andorid世界裏,那麼多須要使用適配器的控件,你如今清楚了嗎?

下次咱們將介紹外觀模式,咱們下次再會。

愛生活,愛學習,愛感悟,愛挨踢

相關文章
相關標籤/搜索