# 适配器模式

## 目录
- [适配器模式概念](#适配器模式概念)
- [类适配器](#类适配器)
- [对象适配器](#对象适配器)
- [适配器模式应用](#适配器模式应用)
- [适配器模式最佳实践](#适配器模式最佳实践)
- [面试常见问题](#面试常见问题)

---

## 适配器模式概念

### 定义

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

### 使用场景

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

---

## 类适配器

### 实现方式

```java
// 目标接口
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();
```

### 特点

```java
// 优点：
// 1. 实现简单

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

---

## 对象适配器

### 实现方式

```java
// 目标接口
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();
```

### 特点

```java
// 优点：
// 1. 更灵活，使用组合
// 2. 可以适配多个类

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

---

## 适配器模式应用

### Android 中的应用

#### 1. RecyclerView.Adapter

```java
// 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

```java
// 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. 选择合适的适配器类型

```java
// 简单场景：类适配器
// 复杂场景：对象适配器
```

### 2. 保持适配器简单

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

---

## 面试常见问题

### Q1: 适配器模式的原理？

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

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

**答案：**
- **类适配器**：使用继承，不够灵活
- **对象适配器**：使用组合，更灵活

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

**答案：**
- RecyclerView.Adapter
- ListView.Adapter
- 将数据适配到 View

---

*最后更新：2024年*
