6月更文挑战|设计模式 —— 适配器模式

477 阅读3分钟

这是我参与更文挑战的第20天,活动详情查看:更文挑战

适配器模式

适配器模式就是将两者不兼容的类融合在一起,通过转换将不同东西能够协作起来。在不修改不兼容类的接口基础上,创建新接口让适配器对不兼容类进行兼容操作来满足需求。

适配器模式定义:把一个类的接口变换成客户端期待的另一个接口,使得原本不匹配的两个类能够一起工作。

适配器模式角色:

  1. Target 目标角色,最终期望得到的接口
  2. Adaptee 现在需要适配的接口
  3. Adapter 适配器角色,适配器把源接口转换成目标接口

实战

类适配器模式

Target目标接口是FiveVolt需要实现支持getVolt获取低电压功能;Volt220代表Adaptee是需要被转换的对象;VoltAdapter就是Adapter,对应目标是支持getVolt接口输出获取低电压,最终通过VoltAdapter继承Volt220实现FiveVolt接口解决了接口不兼容的问题。

public interface FiveVolt{
    public int getVolt();
}
public class Volt220{
    public int getVolt220(){
        return 220;
    }
}
public class VoltAdapter extends Volt220 implements FiveVolt{
    @override
    public int getVolt5(){
        return 5;
    }
}

VoltAdapter adpater = new VoltAdapter();
adpater.getVolt();

对象适配器模式

对象适配器方式和类适配器方式稍有不同,比起类适配器更加灵活实用,对象适配器不会暴露被适配对象方法,在做兼容上开发者就不会直接接触到被适配对象也无法使用被适配者任何功能,就能够避免适配器暴露不必要的接口方法。因此相比较而言一般情况下使用对象适配器模式更为合适。

public interface FiveVolt{
    public int getVolt();
}
public class Volt220{
    public int getVolt220(){
        return 220;
    }
}
public class VoltAdapter implements FiveVolt{
    Volt220 volt220;
    public VoltAdapter(Volt220 volt220){
        this.volt220 = volt220;
    }
    public int getVolt220(){
        return volt220.getVolt220();
    }
    @override
    public int getVolt5(){
        return 5;
    }
}

VoltAdapter adpater = new VoltAdapter(new getVolt220());
adpater.getVolt();

Android中的适配器

在Android开发中ListView列表展示中就是使用适配器BaseAdapter去承载列表的每个元素对象ItemView。对于列表中每个元素而且可能视图相似或者不同但最终对于UI渲染而言所展示最终还是View对象。所以在Android列表开发也是用到适配器BaseAdapter,通过获取数据集的数量、数据信息,在内部会根据数据形态选择构建不同UI布局,但展示上会通过getView方法整合了统一输出方法得到最终统一结果View。

public class ViewAdapter extends BaseAdapter{
 
    private LayoutInflater mInflater;
    List<String> mDatas ;
 
    public ViewAdapter(Context context, List<String> datas){
      this.mInflater = LayoutInflater.from(context);
      mDatas = datas ;
    }
    @Override
    public int getCount() {
      return mDatas.size();
    }

 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null;
      // Item View的复用
      if (convertView == null) {
        holder = new ViewHolder(); 
        convertView = mInflater.inflate(R.layout.my_listview_item, null);
        // 获取title
        holder.title = (TextView)convertView.findViewById(R.id.title);
        convertView.setTag(holder);
      } else {
        holder = (ViewHolder)convertView.getTag();
      }
      holder.title.setText(mDatas.get(position));
      return convertView;
    }
 
  }

总结

适配器模式将原有不兼容的接口融合,然后去支持操作,将整个框架变得更加灵活,拥抱变化。适配器模式的优点在于更好的复用性,通过适配器将功能整合更好的复用。缺点在于过多使用适配器会让系统变得复杂,将原有的接口功能适配到另一个接口实现上去可能并不必要却依旧这么实现最终会让系统变成不可控,有可能还会导致系统需要重构。