適配器模式,淺談什麼是適配器模式,簡單分析

適配器模式

說到適配器模式很多人第一反應就是android中的listview的adapter,哈哈,其實也有那麼點意思,適配器模式我們天天見卻不一定能夠發現:

什麼是適配器模式???

一、作用

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

二、適用場景

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

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

概念:適配者模式是也是Android中應用很廣泛的設計模式,如我們常見用 BaseAdpter, ArrayAdapter, CursorAdapter,就是用的適配者模式;



分類:

適配器模式分三種類型:

1,類適配模式:

Usb接口

  1. public interface Usb {  
  2.   
  3.     void store();  
  4.   
  5.     void takeAlong();  
  6. }  
public interface Usb {

    void store();

    void takeAlong();
}

Phone類

  1. public class Phone {  
  2.   
  3.     public void call() {  
  4.         System.out.println("Phone call");  
  5.     }  
  6.   
  7.     public void sms() {  
  8.         System.out.println("Phone sms");  
  9.     }  
  10.   
  11.     public void takeAlong() {  
  12.         System.out.println("Phone takeAlong");  
  13.     }  
  14. }  
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");  

    }  

  

}  

/**
 * 類的適配器模式
 * 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();  

        Xiaomi mi1 = new Xiaomi();
        mi1.takeAlong();
        mi1.store();

輸出:

Phone takeAlong
store implements usb

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



2,對象適配模式

/**
 * 對象的適配器模式
 *
 * @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();
    }

}


調用方式:

  1. XiaomiWrapper mi2 = new XiaomiWrapper(new Phone());  
  2. mi2.takeAlong();  
  3. mi2.store();  

(3)接口適配模式

  1. /** 
  2.  * 接口的適配器模式 
  3.  * 1.藉助於一個抽象類,該抽象類實現了該接口,實現了所有的方法 
  4.  * 2.繼承類可以選擇性的實現接口中的方法 
  5.  *  
  6.  * @author xuzhaohu 
  7.  *  
  8.  */  
  9. public abstract class AbsPhone implements Usb {  
  10.   
  11.     public void store() {  
  12.         System.out.println("AbsPhone implements usb's store methond");  
  13.     }  
  14.   
  15.     public void takeAlong() {  
  16.         System.out.println("AbsPhone implements usb's takeAlong methond");  
  17.     }  
  18. }  
  19. /**
     * 接口的適配器模式
     * 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()行爲

  1. public class Phone1 extends AbsPhone {  
  2.   
  3.     public void call() {  
  4.         System.out.println("Phone1 call");  
  5.     }  
  6.       
  7.     public void sms() {  
  8.         System.out.println("Phone1 sms");  
  9.     }  
  10.   
  11.     public void store() {  
  12.         System.out.println("Phone1 need usb's store methond");  
  13.     }  
  14.   
  15. }  
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()行爲


  1. public class Phone2 extends AbsPhone {  
  2.   
  3.     public void call() {  
  4.         System.out.println("Phone2 call");  
  5.     }  
  6.   
  7.     public void sms() {  
  8.         System.out.println("Phone2 sms");  
  9.     }  
  10.   
  11.     public void takeAlong() {  
  12.         System.out.println("Phone2 need usb's takeAlong methond");  
  13.     }  
  14.   
  15. }  
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");
    }

}

實例化調用

  1. Phone1 p1 = new Phone1();  
  2. Phone2 p2 = new Phone2();  
  3. p1.store();  
  4. p2.takeAlong();  
        Phone1 p1 = new Phone1();
        Phone2 p2 = new Phone2();
        p1.store();
        p2.takeAlong();

輸出:

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

來一次完整的調用


  1. Phone1 p1 = new Phone1();  
  2. Phone2 p2 = new Phone2();  
  3. p1.store();  
  4. p1.takeAlong();  
  5. p2.takeAlong();  
  6. p2.store();  
        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

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








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