zoukankan      html  css  js  c++  java
  • 设计模式在android中的应用——适配器模式

    原文地址:http://www.eoeandroid.com/thread-228482-1-1.html
    适配器模式:
    把一个类的接口转换为客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。
    又称为:转化器模式、变压器模式或包装模式。

    通俗的来说:
    就像我们平常给笔记本用的充电器一样,不管外接电源是110V、220V还是360V,经过充电器的转化后,输出给笔记本的都是标准而稳定的12V电压。
    如图:
    Android API中的应用:
    ListView与Adapter的应用就是典型的适配器模式。
    如:

      //----------------------------------------------------------------------------------------------声明组件      
         //绑定Layout里面的ListView    
          ListView list = (ListView) findViewById(R.id.ListView01);    
      //----------------------------------------------------------------------------------------------设置数据源        
          //生成动态数组,加入数据    
          ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();    
          for(int i=0;i<10;i++)    
          {    
              HashMap<String, Object> map = new HashMap<String, Object>();    
              map.put("ItemImage", R.drawable.checked);    
              map.put("ItemTitle", "Level "+i);    
              listItem.add(map);    
          }  
      //----------------------------------------------------------------------------------------------导入数据源   
          //生成适配器的Item和动态数组对应的元素    
          SimpleAdapter adapter = new SimpleAdapter(this,listItem,     
              R.layout.list_items,[size=1em]        [size=1em]    
              new String[] {"ItemImage","ItemTitle"},     
              new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}    
          );    
      //----------------------------------------------------------------------------------------------适配      
          //添加并且显示    
         list.setAdapter(adapter);    

    这是我们在android 开发中常用的构造一个ListView组件的方法,对于大家来说异常的熟悉,不用废话了。

    很多人知道这么用,但为什么这么用?这么用的原理是什么?
    明白了 “是什么” 和 “为什么” 才是我们走向成熟的标准。

    下面就以ListView为样例来剖析一下他的工作原理:

    结构如下:
    第一步:构建BaseAdapter抽象父类

      //----------------------------------------------------------------------------------------------声明组件      
         //绑定Layout里面的ListView    
          ListView list = (ListView) findViewById(R.id.ListView01);    
      //----------------------------------------------------------------------------------------------设置数据源        
          //生成动态数组,加入数据    
          ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();    
          for(int i=0;i<10;i++)    
          {    
              HashMap<String, Object> map = new HashMap<String, Object>();    
              map.put("ItemImage", R.drawable.checked);    
              map.put("ItemTitle", "Level "+i);    
              listItem.add(map);    
          }  
      //----------------------------------------------------------------------------------------------导入数据源   
          //生成适配器的Item和动态数组对应的元素    
          SimpleAdapter adapter = new SimpleAdapter(this,listItem,     
              R.layout.list_items,[size=1em]        [size=1em]    
              new String[] {"ItemImage","ItemTitle"},     
              new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}    
          );    
      //----------------------------------------------------------------------------------------------适配      
          //添加并且显示    
         list.setAdapter(adapter);   
      

    第二步:定义ListView方法的接口IListView

      public interface IListView {    
              public void setAdapter(BaseAdapter adapter);  
      }

    第三步:ListView组件类

      public interface IListView {    
              public void setAdapter(BaseAdapter adapter);  
      }


    至此ListView组件已经成型,接下来完成适配器Adapter类
    第四步:适配器接口IAdapter

      public interface IListView {    
              public void setAdapter(BaseAdapter adapter);  
      }

    第五步:生成适配器SimpleAdapter

      public class SimpleAdapter extends BaseAdapter implements IAdapter{  
              ArrayList<HashMap< String,String>> arrayList;  
              String name;  
              public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {  
                      this.arrayList=arrayList;  
                      this.name=name;  
                      this.item=new String[arrayList.size()];  
                      setData();  
              }          
              @Override  
              public void setData() {  
                for(int i=0;i<arrayList.size();i++){  
                        this.item=arrayList.get(i).get(name);  
                }                  
              }  
      }  
      

    Ok,创建类结束!
    应用:

      public class SimpleAdapter extends BaseAdapter implements IAdapter{  
              ArrayList<HashMap< String,String>> arrayList;  
              String name;  
              public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {  
                      this.arrayList=arrayList;  
                      this.name=name;  
                      this.item=new String[arrayList.size()];  
                      setData();  
              }          
              @Override  
              public void setData() {  
                for(int i=0;i<arrayList.size();i++){  
                        this.item=arrayList.get(i).get(name);  
                }                  
              }  
      }  


    输出结果:
    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    总结:
    1.  其实样例中的ListView与SimpleAdapter都是继承了抽象父类BaseAdapter,同时ListView又包裹了SimpleAdapter,从而实现了所谓的“适配”。

    2  .当然Android API中还有ArrayAdapter等其他适配器,不过原理同SimpleAdapter一样,比葫芦画瓢罢了…… ,
        这同时也解释了为什么我们在写 “自定义ListView”  时为什么要继承父类BaseAdapter!


    3.  同样的原理,不同的表现方式。

    适配器模式设计原则:
    1.使用对象组合,面向接口和抽象编程(万年不变)
    2.“开闭”原则

    使用场合:
    1.软件系统结构需要升级或扩展,又不想影响原有的系统的稳定运行的时候;
    2.转换类之间的差别不是太大的时候;
    3.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时候。
  • 相关阅读:
    LeetCoded第239题题解--滑动窗口最大值
    LeetCoded第739题题解--每日温度
    网络流-最大流 Dinic模板
    虚树模板
    UVALive
    UVALive
    hdu6000 Wash ccpc-20162017-finals B Wash
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins
  • 原文地址:https://www.cnblogs.com/miaozhenzhong/p/5930942.html
Copyright © 2011-2022 走看看