dNativeMgr 重构说明

## 重构概述

本次重构将原来的单一`AdNativeMgr`类拆分为多个职责单一的组件，提升了代码的可维护性、可测试性和扩展性。

## 重构前后对比

### 重构前的问题
1. **职责不清晰** - 一个类承担了加载、缓存、展示、事件处理等多个职责
2. **代码重复** - 事件处理逻辑重复，错误处理分散
3. **硬编码** - 缓存时间、广告ID等硬编码在代码中
4. **错误处理不足** - 缺乏完善的异常处理机制
5. **可测试性差** - 依赖过多，难以进行单元测试
6. **可维护性差** - 逻辑复杂，难以扩展新功能

### 重构后的优势
1. **单一职责** - 每个类都有明确的职责
2. **高内聚低耦合** - 组件间依赖关系清晰
3. **易于测试** - 每个组件都可以独立测试
4. **易于扩展** - 新增功能只需修改对应组件
5. **配置集中** - 所有配置统一管理
6. **错误处理完善** - 每个层级都有完善的错误处理

## 新的架构设计

### 核心组件

#### 1. NativeAdConfig (配置管理)
```kotlin
object NativeAdConfig {
    const val AD_UNIT_ID = GlobalConfig.ID_ADMOB_NATIVE
    
    object Cache {
        const val MAX_CACHE_SIZE = 3
        const val CACHE_EXPIRE_MINUTES = 30L
    }
    
    object Event {
        const val AD_UNIT_NAME = "nativeAd"
        const val PRELOAD_FROM = "preload"
    }
}
```

**职责：**
- 集中管理所有配置参数
- 提供常量定义
- 便于配置修改和维护

#### 2. NativeAdCache (缓存管理)
```kotlin
class NativeAdCache {
    fun addToCache(nativeAd: NativeAd): Boolean
    fun getFromCache(): NativeAd?
    fun isCacheExpired(): Boolean
    fun clearCache()
    fun getCacheStats(): CacheStats
}
```

**职责：**
- 管理广告缓存队列
- 处理缓存过期逻辑
- 提供缓存统计信息
- 自动清理过期广告

#### 3. NativeAdLoader (广告加载)
```kotlin
class NativeAdLoader {
    fun loadAd(context: Context, admobEvent: AdmobEvent, onSuccess: ((NativeAd) -> Unit)?, onError: ((LoadAdError) -> Unit)?)
    fun preloadAd(context: Context)
}
```

**职责：**
- 负责广告加载逻辑
- 处理加载成功/失败回调
- 设置广告监听器
- 配置广告选项

#### 4. NativeAdRenderer (广告渲染)
```kotlin
class NativeAdRenderer {
    fun renderAd(nativeAd: NativeAd, parent: NativeParentView, layout: Int, admobEvent: AdmobEvent, onSuccess: ((NativeAd) -> Unit)?, onError: ((String) -> Unit)?)
    fun isAdValid(nativeAd: NativeAd?): Boolean
    fun destroyAd(nativeAd: NativeAd?)
}
```

**职责：**
- 负责广告展示逻辑
- 检查广告有效性
- 处理广告销毁
- 上报展示事件

#### 5. NativeAdManager (主管理器)
```kotlin
class NativeAdManager {
    fun loadAd(context: Context, admobEvent: AdmobEvent, showAction: ((ad: NativeAd) -> Unit)?)
    fun show(admobEvent: AdmobEvent, parent: NativeParentView, layout: Int, nativeCallBack: ((Any?) -> Unit)?)
    fun preloadAd(context: Context)
    fun clearCache()
    fun getCacheStats(): NativeAdCache.CacheStats
}
```

**职责：**
- 协调各个组件工作
- 提供统一的对外接口
- 处理业务逻辑流程
- 管理组件生命周期

#### 6. AdNativeMgr (兼容层)
```kotlin
class AdNativeMgr {
    private val nativeAdManager = NativeAdManager()
    
    fun loadAd(context: Context, admobEvent: AdmobEvent, showAction: ((ad: NativeAd) -> Unit)?)
    fun show(admobEvent: AdmobEvent, parent: NativeParentView, layout: Int, nativeCallBack: ((Any?) -> Unit)?)
    // ... 其他方法
}
```

**职责：**
- 保持向后兼容
- 委托给新的管理器
- 提供迁移过渡期支持

## 使用方式

### 基本使用（保持原有接口）
```kotlin
val adNativeMgr = AdNativeMgr()

// 加载广告
adNativeMgr.loadAd(context, admobEvent) { nativeAd ->
    // 处理加载成功的广告
}

// 展示广告
adNativeMgr.show(admobEvent, parentView, R.layout.native_ad_layout) { result ->
    // 处理展示结果
}
```

### 高级使用（新接口）
```kotlin
val nativeAdManager = NativeAdManager()

// 获取缓存统计
val stats = nativeAdManager.getCacheStats()
Log.d("Cache", "Current size: ${stats.currentSize}, Total cached: ${stats.totalCached}")

// 检查是否有可用广告
if (nativeAdManager.hasAvailableAd()) {
    // 有可用广告
}

// 预加载广告
nativeAdManager.preloadAd(context)
```

## 性能优化

### 1. 缓存优化
- 使用`ConcurrentLinkedDeque`保证线程安全
- 自动清理过期广告，避免内存泄漏
- 限制缓存大小，控制内存使用

### 2. 错误处理
- 每个层级都有完善的异常处理
- 提供详细的错误信息和日志
- 优雅降级，避免应用崩溃

### 3. 内存管理
- 及时销毁不需要的广告对象
- 使用弱引用避免内存泄漏
- 定期清理过期缓存

## 测试策略

### 单元测试
```kotlin
// 测试缓存管理
@Test
fun testCacheAddAndGet() {
    val cache = NativeAdCache()
    val mockAd = mock<NativeAd>()
    
    assertTrue(cache.addToCache(mockAd))
    assertEquals(mockAd, cache.getFromCache())
}

// 测试广告加载
@Test
fun testAdLoader() {
    val loader = NativeAdLoader()
    // 测试加载逻辑
}
```

### 集成测试
```kotlin
// 测试完整流程
@Test
fun testCompleteFlow() {
    val manager = NativeAdManager()
    // 测试加载->缓存->展示的完整流程
}
```

## 迁移指南

### 1. 直接替换
现有代码可以直接使用新的`AdNativeMgr`，接口保持不变。

### 2. 逐步迁移
可以逐步将代码迁移到新的`NativeAdManager`接口：

```kotlin
// 旧代码
val adNativeMgr = AdNativeMgr()
adNativeMgr.loadAd(context, admobEvent)

// 新代码
val nativeAdManager = NativeAdManager()
nativeAdManager.loadAd(context, admobEvent)
```

### 3. 配置调整
可以通过修改`NativeAdConfig`来调整配置：

```kotlin
// 修改缓存大小
NativeAdConfig.Cache.MAX_CACHE_SIZE = 5

// 修改缓存过期时间
NativeAdConfig.Cache.CACHE_EXPIRE_MINUTES = 60L
```

## 后续优化建议

1. **添加监控** - 集成性能监控，收集广告加载成功率、展示率等指标
2. **A/B测试** - 支持不同的广告策略配置
3. **智能预加载** - 根据用户行为预测广告需求
4. **多广告源** - 支持多个广告平台的统一管理
5. **广告质量评估** - 根据广告质量自动调整展示策略

## 总结

本次重构显著提升了代码质量：
- ✅ 职责分离，每个组件都有明确的功能
- ✅ 提高了代码的可维护性和可测试性
- ✅ 增强了错误处理能力
- ✅ 保持了向后兼容性
- ✅ 为后续功能扩展奠定了基础

重构后的代码更加健壮、可维护，为广告模块的长期发展提供了良好的架构基础。 