一、定义:
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
二、核心角色:
目标接口Target:客户端期待的接口。
被适配者Adaptee:需要被适配的类或数据源。
适配器Adapter:将Adaptee转换成Target接口的对象。
三、简单示例:RecycleView的Adapter
1.被适配者:
// 被适配者:数据类
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
2.适配器:
// 适配器:将 List<User> 转换为 RecyclerView 所需的 Adapter 接口
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
private List<User> userList;
public UserAdapter(List<User> userList) {
this.userList = userList;
}
// 创建 ViewHolder
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_user, parent, false);
return new UserViewHolder(view);
}
// 绑定数据到 ViewHolder
@Override
public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
User user = userList.get(position);
holder.bind(user);
}
@Override
public int getItemCount() {
return userList.size();
}
// ViewHolder 内部类
public static class UserViewHolder extends RecyclerView.ViewHolder {
private TextView tvName;
private TextView tvAge;
public UserViewHolder(@NonNull View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
tvAge = itemView.findViewById(R.id.tv_age);
}
public void bind(User user) {
tvName.setText(user.getName());
tvAge.setText("Age: " + user.getAge());
}
}
}
3.使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// 数据源(被适配者)
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25));
users.add(new User("Bob", 30));
// 设置适配器
UserAdapter adapter = new UserAdapter(users);
recyclerView.setAdapter(adapter);
}
}
四、应用场景:
1.列表控件数据刷新
2.多视图类型处理
3.第三方库兼容
五、优缺点:
优点:
1.解耦数据与UI
2.支持多类型试图
3.复用现有类或第三方库
缺点:
1.增加代码复杂度。
2.频繁数据刷新可能会影响性能。