Android開發設計模式之——適配者模式

適配者模式是也是android中應用很廣泛的設計模式,如我們常見用 BaseAdpter, ArrayAdapter, CursorAdapter,就是用的適配者模式,看到源碼你是不是對這種設計方式很陌生,沒事,下面我們通過實際的例子來取理解這種設計模式。

一、作用

適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。

二、適用場景

1. 業務的接口與工作的類不兼容,(比如:類中缺少實現接口的某些方法)但又需要兩者一起工作

2. 在現有接口和類的基礎上爲新的業務需求提供接口

三、常見的使用方式

還是以Usb接口和Phone手機類的產品舉例子,假設設計的Phone類中有 call(), sms(), takeAlong()屬性方法,而在設計Usb接口時定義了 store(), takeAlong()的行爲。如果現在有新的業務需求,需要生成 Xiaomi手機類具有 Phone類和Usb接口兩者功能,假設Phone類和Usb接口已經在業務上投入使用,很顯然,去修改原類中的方法和接口的行爲去滿足現在的新業務需求是不可取的,那麼現在適配者模式就派上用場了。

(1)類適配模式

大致的意思是新的業務類Xiaomi通過繼承舊業務的類Phone並實現接口Usb來滿足新的業務的一種適配方式,如下圖

Usb接口

public interface Usb {

    void store();

    void takeAlong();
}
Phone類
public class Phone {

    public void call() {
        System.out.println("Phone call");
    }

    public void sms() {
        System.out.println("Phone sms");
    }

    public void takeAlong() {
        System.out.println("Phone takeAlong");
    }
}
適配 Xiaomi 類
/**
 * 類的適配器模式
 * phone + Usb
 * 將Phone的功能擴展到Usb裏
 * @author xuzhaohu
 * 
 */
public class Xiaomi extends Phone implements Usb {

    @Override
    public void store() {
        // TODO Auto-generated method stub
        System.out.println("store implements usb");
    }

}

適配完後使用

        Xiaomi mi1 = new Xiaomi();
        mi1.takeAlong();
        mi1.store();
輸出:

Phone takeAlong
store implements usb

這樣新的業務需求就可以通過適配的 Xiaomi類去滿足了。是不是覺得很簡單呢!!:)  有沒有其他的方式去實現同樣的功能呢?當然有,就是下面要講的對象適配模式。

(2)對象適配模式

實現的方式很簡單,其實就是在適配的時候通過構造函數將舊的業務Phone 當作新的適配類(XiaomiWrapper)一個成員對象去處理,然後適配類只需要實現接口 Usb即可。如下類關係圖

適配類XiaomiWrapper如下,注意takeAlong()方法,是直接調用原類對象(Phone)去執行的。

/**
 * 對象的適配器模式
 * 
 * @author xuzhaohu
 * 
 */
public class XiaomiWrapper implements Usb {

    /**
     * 1.創建一個Wrapper類,持有原類的一個實例,
     * 2.在Wrapper類的方法中,調用實例的方法就行
     */
    private Phone phone;

    public XiaomiWrapper(Phone phone) {

        this.phone = phone;
    }

    @Override
    public void store() {
        // TODO Auto-generated method stub
        System.out.println("store implements usb");

    }

    @Override
    public void takeAlong() {
        // TODO Auto-generated method stub
        phone.takeAlong();
    }

}
適配完後通過構造函數將原對象傳入即可。
        XiaomiWrapper mi2 = new XiaomiWrapper(new Phone());
        mi2.takeAlong();
        mi2.store();
輸出:

Phone takeAlong
store implements usb

或許到這裏,你會覺得這種方式很簡單吧。但是如果出現這個Usb接口中有很多方法(大於2個),但是新的業務需求中也只需要其中的一兩個,而且是需要適配很多這樣的業務,這樣的話,用上面的方法每次適配一次就會去實現所有Usb接口中的方法,實際上適配的類中有很多是用不到的,沒有必要把接口中不使用的類也適配進去,這時候,就輪到下面的接口適配模式出場了。

(3)接口適配模式

適配新的業務需求的時候藉助抽象實現類(AbsPhone實現Usb接口),也就說,抽象實現類把Usb接口中的行爲都實現了,新的適配是需要跟抽象類對話就行,因爲抽象實現類就能滿足了所有適配的需求,並且做到了只適配業務本身的行爲,接口中不需要的行爲我根本不需要關注。這就是抽象實現類的作用。類圖關係如下:


抽象類AbsPhone實現

/**
 * 接口的適配器模式
 * 1.藉助於一個抽象類,該抽象類實現了該接口,實現了所有的方法
 * 2.繼承類可以選擇性的實現接口中的方法
 * 
 * @author xuzhaohu
 * 
 */
public abstract class AbsPhone implements Usb {

    public void store() {
        System.out.println("AbsPhone implements usb's store methond");
    }

    public void takeAlong() {
        System.out.println("AbsPhone implements usb's takeAlong methond");
    }
}
適配類只跟AbsPhone打交道,根本不需要關心接口的行爲,只顯示自己所要關注的。

如Phone1適配只需要store()行爲

public class Phone1 extends AbsPhone {

    public void call() {
        System.out.println("Phone1 call");
    }
    
    public void sms() {
        System.out.println("Phone1 sms");
    }

    public void store() {
        System.out.println("Phone1 need usb's store methond");
    }

}
Phone2適配只需要takeAlong()行爲

public class Phone2 extends AbsPhone {

    public void call() {
        System.out.println("Phone2 call");
    }

    public void sms() {
        System.out.println("Phone2 sms");
    }

    public void takeAlong() {
        System.out.println("Phone2 need usb's takeAlong methond");
    }

}
實例化調用
        Phone1 p1 = new Phone1();
        Phone2 p2 = new Phone2();
        p1.store();
        p2.takeAlong();
輸出:

Phone1 need usb's store methond
Phone2 need usb's takeAlong methond

來一次完整的調用

        Phone1 p1 = new Phone1();
        Phone2 p2 = new Phone2();
        p1.store();
        p1.takeAlong();
        p2.takeAlong();
        p2.store();
輸出:

Phone1 need usb's store methond
AbsPhone implements usb's takeAlong methond
Phone2 need usb's takeAlong methond
AbsPhone implements usb's store methond

這樣很清晰的知道適配的什麼方法了。


總結:適配者模式在android源碼中有很多這樣的體現,大家看完這個再去看源碼,是不是會感覺看懂了不少呢?


參考:http://zz563143188.iteye.com/blog/1847029

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章