适配器模式

Posted _Doing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。

 
  • 何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。主要解决将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
  • 如何解决类适配器模式:继承对象适配器模式(推荐):依赖注入 / 代理适配器继承或依赖已有的对象,实现想要的目标接口
  • 优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
  • 缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
  • 使用场景:1、JAVA 中的 jdbc。2、android的ListView的Adapter
  • 注意事项:1、适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。2、建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承
 
类适配器模式
  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
 
 
 

以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从片段适配器启动活动

片段中ListView的android自定义适配器

设计模式之单例模式

片段内带有基本适配器的列表视图

片段中gridview的Android文本和图像适配器