# 策略模式

## 目录
- [策略模式概念](#策略模式概念)
- [策略模式实现](#策略模式实现)
- [策略模式应用](#策略模式应用)
- [策略模式最佳实践](#策略模式最佳实践)
- [面试常见问题](#面试常见问题)

---

## 策略模式概念

### 定义

```java
// 策略模式：定义一系列算法，把它们封装起来
// 使它们可以互相替换
// 策略模式让算法独立于使用它的客户而变化
```

### 使用场景

```java
// 1. 有多种算法实现
// 2. 需要在运行时选择算法
// 3. 避免使用大量的 if-else
```

---

## 策略模式实现

### 基本实现

```java
// 策略接口
public interface Strategy {
    int calculate(int a, int b);
}

// 具体策略
public class AddStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

public class SubtractStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class MultiplyStrategy implements Strategy {
    @Override
    public int calculate(int a, int b) {
        return a * b;
    }
}

// 上下文
public class Context {
    private Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public int execute(int a, int b) {
        return strategy.calculate(a, b);
    }
}

// 使用
Context context = new Context(new AddStrategy());
int result = context.execute(10, 5); // 15

context.setStrategy(new SubtractStrategy());
result = context.execute(10, 5); // 5
```

---

## 策略模式应用

### Android 中的应用

#### 1. 动画插值器

```java
// 动画插值器使用策略模式
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
animator.setInterpolator(new AccelerateInterpolator()); // 策略
animator.start();
```

#### 2. 图片加载策略

```java
// 图片加载策略
public interface ImageLoadStrategy {
    void loadImage(String url, ImageView imageView);
}

public class GlideStrategy implements ImageLoadStrategy {
    @Override
    public void loadImage(String url, ImageView imageView) {
        Glide.with(imageView.getContext()).load(url).into(imageView);
    }
}

public class PicassoStrategy implements ImageLoadStrategy {
    @Override
    public void loadImage(String url, ImageView imageView) {
        Picasso.get().load(url).into(imageView);
    }
}
```

---

## 策略模式最佳实践

### 1. 使用枚举

```java
// 使用枚举定义策略
public enum StrategyType {
    ADD {
        @Override
        public int calculate(int a, int b) {
            return a + b;
        }
    },
    SUBTRACT {
        @Override
        public int calculate(int a, int b) {
            return a - b;
        }
    };
    
    public abstract int calculate(int a, int b);
}
```

### 2. 结合工厂模式

```java
// 使用工厂模式创建策略
public class StrategyFactory {
    public static Strategy createStrategy(String type) {
        switch (type) {
            case "add":
                return new AddStrategy();
            case "subtract":
                return new SubtractStrategy();
            default:
                return new AddStrategy();
        }
    }
}
```

---

## 面试常见问题

### Q1: 策略模式的原理？

**答案：**
- 定义一系列算法，封装起来
- 使它们可以互相替换
- 算法独立于使用它的客户

### Q2: 策略模式和工厂模式的区别？

**答案：**
- **工厂模式**：关注对象创建
- **策略模式**：关注算法选择

### Q3: Android 中的策略模式应用？

**答案：**
- 动画插值器
- 图片加载策略
- 网络请求策略

---

*最后更新：2024年*
