xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • Android开发中不可容忽视的10大设计模式

Android开发中不可容忽视的10大设计模式

一、架构模式:构建可维护的应用基础

  1. MVVM(Model-View-ViewModel)模式

    • 核心思想:通过数据绑定实现UI与业务逻辑解耦。ViewModel管理数据状态,View观察LiveData自动更新。
    • Android应用:
      class UserViewModel : ViewModel() {
          private val _userName = MutableLiveData<String>()
          val userName: LiveData<String> = _userName  // View观察此数据
          fun updateName(name: String) { _userName.value = name }
      }
      // Activity中观察数据变化
      userViewModel.userName.observe(this) { name -> textView.text = name }
    • 优势:避免内存泄漏(自动感知生命周期),支持单向数据流。
  2. Repository模式

    • 作用:统一数据源入口,隔离本地数据库(Room)与远程API(Retrofit)的实现细节。
    • 代码结构:
      class UserRepository(private val localDao: UserDao, private val apiService: ApiService) {
          suspend fun getUsers(): List<User> {
              val remoteUsers = apiService.fetchUsers()  // 网络请求
              localDao.insertAll(remoteUsers)            // 缓存到本地
              return localDao.getAll()
          }
      }

二、创建型模式:优化对象创建流程

  1. 单例模式(Singleton)

    • 场景:全局唯一实例(如数据库管理类),避免重复创建资源。
    • 双重校验锁实现(线程安全):
      class DatabaseManager private constructor() {
          companion object {
              @Volatile private var instance: DatabaseManager? = null
              fun getInstance(): DatabaseManager = instance ?: synchronized(this) {
                  instance ?: DatabaseManager().also { instance = it }
              }
          }
      }
    • 注意:避免持有Activity引用导致内存泄漏。
  2. 建造者模式(Builder)

    • 应用:简化复杂对象配置(如AlertDialog、Retrofit)。
    • 链式调用示例:
      val dialog = AlertDialog.Builder(context)
          .setTitle("提示")
          .setMessage("确认删除?")
          .setPositiveButton("确定") { dialog, _ -> dialog.dismiss() }
          .create()

三、行为型模式:高效管理对象交互

  1. 观察者模式(Observer)

    • 机制:LiveData/EventBus实现一对多通知,数据变更自动更新UI。
    • LiveData核心:MutableLiveData存储数据,observe()绑定生命周期感知的观察者。
  2. 策略模式(Strategy)

    • 场景:动态切换算法(如支付方式、图片加载策略)。
    • 代码示例:
      interface PaymentStrategy { fun pay(amount: Double) }
      class AlipayStrategy : PaymentStrategy {
          override fun pay(amount: Double) { /* 支付宝逻辑 */ }
      }
      class PaymentProcessor(private val strategy: PaymentStrategy) {
          fun processPayment(amount: Double) { strategy.pay(amount) }
      }
      // 使用
      PaymentProcessor(AlipayStrategy()).processPayment(100.0)
  3. 命令模式(Command)

    • 应用:封装操作为对象(如Runnable、Handler消息),支持队列与撤销。
    • 案例:Handler.post(Runnable)将任务封装为可传递的命令对象。

四、结构型模式:灵活组合对象

  1. 适配器模式(Adapter)

    • 作用:转换接口(如RecyclerView.Adapter绑定数据与视图)。
    • 关键代码:
      class UserAdapter(private val users: List<User>) : RecyclerView.Adapter<UserAdapter.ViewHolder>() {
          inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
              fun bind(user: User) { /* 绑定数据到View */ }
          }
          override fun onBindViewHolder(holder: ViewHolder, position: Int) {
              holder.bind(users[position])
          }
      }
  2. 外观模式(Facade)

    • 场景:简化复杂子系统调用(如Glide封装图片加载流程)。
    • 示例:
      class ImageLoaderFacade(context: Context) {
          fun load(url: String, imageView: ImageView) {
              Glide.with(context).load(url).into(imageView)  // 隐藏网络请求、缓存等细节
          }
      }
  3. 代理模式(Proxy)

    • 应用:控制对象访问(如权限检查、图片懒加载)。
    • 缓存代理示例:
      class ImageLoaderProxy : ImageLoader {
          private val realLoader = RealImageLoader()
          private val cache = HashMap<String, Bitmap>()
          override fun load(url: String) {
              cache[url]?.let { showBitmap(it) } ?: realLoader.load(url)  // 优先读缓存
          }
      }

五、其他关键模式

  1. 责任链模式

    • 案例:OkHttp拦截器链,每个拦截器处理请求并决定传递。
  2. 装饰器模式

    • Android实现:ContextWrapper包装原始Context,扩展功能而不修改基类。

六、设计模式选择指南

问题类型推荐模式示例场景
全局配置共享单例模式数据库客户端
数据与UI同步观察者模式LiveData监听
动态创建对象工厂模式Retrofit实例化
复杂参数配置建造者模式AlertDialog构建器
算法灵活切换策略模式支付方式选择

总结

设计模式是解决Android开发痛点的利器:

  • 解耦与复用:MVVM和Repository分离关注点,提升测试性;
  • 性能优化:单例模式减少资源消耗,享元模式(如Message.obtain())复用对象;
  • 扩展性:策略模式支持动态替换算法,装饰器模式灵活添加功能;
  • 代码简洁性:建造者模式简化多参数配置,外观模式封装复杂调用。

建议:

  1. 避免过度设计——优先使用Jetpack组件(ViewModel、LiveData)内置模式;
  2. 组合模式——如MVVM+Repository+观察者构建稳健架构;
  3. 关注生命周期——单例中避免持有View引用,防止内存泄漏。
最后更新: 2025/9/29 08:41