Files
mkdocs/docs/android面试/设计模式/适配器模式.md
2026-01-15 11:53:37 +08:00

3.9 KiB
Raw Permalink Blame History

适配器模式

目录


适配器模式概念

定义

// 适配器模式:将一个类的接口转换成客户希望的另一个接口
// 使原本不兼容的类可以一起工作

使用场景

// 1. 需要使用现有类,但接口不兼容
// 2. 需要统一多个类的接口
// 3. 需要复用现有功能

类适配器

实现方式

// 目标接口
public interface Target {
    void request();
}

// 被适配的类
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器(类适配器)
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 使用
Target target = new Adapter();
target.request();

特点

// 优点:
// 1. 实现简单

// 缺点:
// 1. 需要继承,不够灵活
// 2. 不能适配多个类

对象适配器

实现方式

// 目标接口
public interface Target {
    void request();
}

// 被适配的类
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器(对象适配器)
public class Adapter implements Target {
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 使用
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();

特点

// 优点:
// 1. 更灵活,使用组合
// 2. 可以适配多个类

// 缺点:
// 1. 需要创建适配器对象

适配器模式应用

Android 中的应用

1. RecyclerView.Adapter

// RecyclerView 使用适配器模式
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String> data;
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textView.setText(data.get(position));
    }
    
    @Override
    public int getItemCount() {
        return data.size();
    }
}

2. ListView.Adapter

// ListView 使用适配器模式
public class MyAdapter extends BaseAdapter {
    private List<String> data;
    
    @Override
    public int getCount() {
        return data.size();
    }
    
    @Override
    public Object getItem(int position) {
        return data.get(position);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 创建或复用 View
        return convertView;
    }
}

适配器模式最佳实践

1. 选择合适的适配器类型

// 简单场景:类适配器
// 复杂场景:对象适配器

2. 保持适配器简单

// 适配器只负责接口转换
// 不要添加额外业务逻辑

面试常见问题

Q1: 适配器模式的原理?

答案:

  • 将一个类的接口转换成客户希望的另一个接口
  • 使原本不兼容的类可以一起工作

Q2: 类适配器和对象适配器的区别?

答案:

  • 类适配器:使用继承,不够灵活
  • 对象适配器:使用组合,更灵活

Q3: Android 中的适配器模式应用?

答案:

  • RecyclerView.Adapter
  • ListView.Adapter
  • 将数据适配到 View

最后更新2024年