適配器模式

 
  • 什麼時候使用: 一、系統須要使用現有的類,而此類的接口不符合系統的須要。 二、想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做,這些源類不必定有一致的接口。 三、經過接口轉換,將一個類插入另外一個類系中。主要解決將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做主要解決在軟件系統中,經常要將一些"現存的對象"放到新的環境中,而新環境要求的接口是現對象不能知足的。有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。
  • 如何解決類適配器模式:繼承對象適配器模式(推薦):依賴注入 / 代理適配器繼承或依賴已有的對象,實現想要的目標接口
  • 優勢: 一、可讓任何兩個沒有關聯的類一塊兒運行。 二、提升了類的複用。 三、增長了類的透明度。 四、靈活性好。
  • 缺點: 一、過多地使用適配器,會讓系統很是零亂,不易總體進行把握。好比,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統若是太多出現這種狀況,無異於一場災難。所以若是不是頗有必要,能夠不使用適配器,而是直接對系統進行重構。 2.因爲 JAVA 至多繼承一個類,因此至多隻能適配一個適配者類,並且目標類必須是抽象類。
  • 使用場景:一、JAVA 中的 jdbc。二、Android的ListView的Adapter
  • 注意事項:一、適配器不是在詳細設計時添加的,而是解決正在服役的項目的問題。二、建議儘可能使用對象適配器的實現方式,多用合成/聚合、少用繼承
 
類適配器模式
  1. // Target角色,適配目標
  2. public interface FiveVolt{
  3.     publicint getVolt5();
  4. }
  5.  
  6. //Adaptee角色,須要被轉換的對象
  7. publicclassVolt220{
  8.     publicint getVolt220(){
  9.         return220;
  10.     }
  11. }
  12.  
  13. // adapter角色
  14. publicclassClassAdapter extends Volt220 implements FiveVolt{
  15.  
  16.     @Override
  17.     publicint getVolt5(){
  18.         return5;
  19.     }
  20. }
 
  1. publicclassTest{
  2.     publicstaticvoid main(String[] args){
  3.         ClassAdapter adapter =newClassAdapter();
  4.         System.out.println("輸出電壓 : "+ adapter.getVolt5());
  5.     }
  6. }
 
對象適配器模式
  1. // Target角色,適配目標
  2. public interface FiveVolt{
  3.     publicint getVolt5();
  4. }
  5.  
  6. // Adaptee角色,須要被轉換的對象
  7. publicclassVolt220{
  8.     publicint getVolt220(){
  9.         return220;
  10.     }
  11. }
  12.  
  13. // 對象適配器
  14. publicclassObjectAdapter implements FiveVolt{
  15.  
  16.     Volt220 mVolt220;
  17.  
  18.     publicObjectAdapter(Volt220 adaptee){
  19.         mVolt220 = adaptee;
  20.     }
  21.  
  22.     publicint getVolt220(){
  23.         return mVolt220.getVolt220();
  24.     }
  25.  
  26.     @Override
  27.     publicint getVolt5(){
  28.         return5;
  29.     }
  30.  
  31. }
 
  1. publicclassTest{
  2.     publicstaticvoid main(String[] args){
  3.         ClassAdapter adapter =newClassAdapter();
  4.         System.out.println("輸出電壓 : "+ adapter.getVolt5());
  5.     }
  6. }
 
ListView中的Adapter模式
    ListView須要可以顯示各式各樣的視圖,每一個人須要的顯示效果各不相同,顯示的數據類型、數量等也變幻無窮。那麼如何隔離這種變化尤其重要。 Android的作法是增長一個Adapter層來應對變化, 將ListView顯示時須要的數據經過接口抽象到Adapter對象中,這樣只要用戶實現了Adapter的接口,ListView就能夠從Adapter中的接口函數取得用戶設定的顯示效果、數量、數據來顯示特定的Item View
  • 經過代理數據集來告知ListView數據的個數( getCount函數 )以及每一個數據的類型( getItem函數 )。
  • 最重要的是要解決Item View的輸出,Item View變幻無窮,但終究它都是View類型,Adapter統一將Item View經過 getView函數 輸出爲View ,這樣就很好的應對了Item View的可變性。
  1. // 代碼省略
  2. ListView myListView =(ListView)findViewById(listview_id);
  3. // 設置適配器
  4. myListView.setAdapter(newMyAdapter(context, myDatas));
  5.  
  6. // 適配器
  7. publicclassMyAdapter extends BaseAdapter{
  8.  
  9.         privateLayoutInflater mInflater;
  10.         List<String> mDatas ;
  11.  
  12.         publicMyAdapter(Context context,List<String> datas){
  13.             this.mInflater =LayoutInflater.from(context);
  14.             mDatas = datas ;
  15.         }
  16.         @Override
  17.         publicint getCount(){
  18.             return mDatas.size();
  19.         }
  20.  
  21.         @Override
  22.         publicString getItem(int pos){
  23.             return mDatas.get(pos);
  24.         }
  25.  
  26.         @Override
  27.         publiclong getItemId(int pos){
  28.             return pos;
  29.         }
  30.  
  31.         // 解析、設置、緩存convertView以及相關內容
  32.         @Override
  33.         publicView getView(int position,View convertView,ViewGroup parent){
  34.             ViewHolder holder = null;
  35.             // Item View的複用
  36.             if(convertView == null){
  37.                 holder =newViewHolder(); 
  38.                 convertView = mInflater.inflate(R.layout.my_listview_item, null);
  39.                 // 獲取title
  40.                 holder.title =(TextView)convertView.findViewById(R.id.title);
  41.                 convertView.setTag(holder);
  42.             }else{
  43.                 holder =(ViewHolder)convertView.getTag();
  44.             }
  45.             holder.title.setText(mDatas.get(position));
  46.             return convertView;
  47.         }
  48.  
  49.     }
 
來源:Android源碼之ListView的適配器模式: http://blog.csdn.net/bboyfeiyu/article/details/43950185
相關文章
相關標籤/搜索