3.9 KiB
3.9 KiB
适配器模式
目录
适配器模式概念
定义
// 适配器模式:将一个类的接口转换成客户希望的另一个接口
// 使原本不兼容的类可以一起工作
使用场景
// 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年