Android开发中不可容忽视的10大设计模式
一、架构模式:构建可维护的应用基础
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 }
- 优势:避免内存泄漏(自动感知生命周期),支持单向数据流。
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() } }
二、创建型模式:优化对象创建流程
单例模式(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引用导致内存泄漏。
建造者模式(Builder)
- 应用:简化复杂对象配置(如AlertDialog、Retrofit)。
- 链式调用示例:
val dialog = AlertDialog.Builder(context) .setTitle("提示") .setMessage("确认删除?") .setPositiveButton("确定") { dialog, _ -> dialog.dismiss() } .create()
三、行为型模式:高效管理对象交互
观察者模式(Observer)
- 机制:LiveData/EventBus实现一对多通知,数据变更自动更新UI。
- LiveData核心:
MutableLiveData
存储数据,observe()
绑定生命周期感知的观察者。
策略模式(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)
命令模式(Command)
- 应用:封装操作为对象(如Runnable、Handler消息),支持队列与撤销。
- 案例:
Handler.post(Runnable)
将任务封装为可传递的命令对象。
四、结构型模式:灵活组合对象
适配器模式(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]) } }
外观模式(Facade)
- 场景:简化复杂子系统调用(如Glide封装图片加载流程)。
- 示例:
class ImageLoaderFacade(context: Context) { fun load(url: String, imageView: ImageView) { Glide.with(context).load(url).into(imageView) // 隐藏网络请求、缓存等细节 } }
代理模式(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) // 优先读缓存 } }
五、其他关键模式
责任链模式
- 案例:OkHttp拦截器链,每个拦截器处理请求并决定传递。
装饰器模式
- Android实现:
ContextWrapper
包装原始Context,扩展功能而不修改基类。
- Android实现:
六、设计模式选择指南
问题类型 | 推荐模式 | 示例场景 |
---|---|---|
全局配置共享 | 单例模式 | 数据库客户端 |
数据与UI同步 | 观察者模式 | LiveData监听 |
动态创建对象 | 工厂模式 | Retrofit实例化 |
复杂参数配置 | 建造者模式 | AlertDialog构建器 |
算法灵活切换 | 策略模式 | 支付方式选择 |
总结
设计模式是解决Android开发痛点的利器:
- 解耦与复用:MVVM和Repository分离关注点,提升测试性;
- 性能优化:单例模式减少资源消耗,享元模式(如Message.obtain())复用对象;
- 扩展性:策略模式支持动态替换算法,装饰器模式灵活添加功能;
- 代码简洁性:建造者模式简化多参数配置,外观模式封装复杂调用。
建议:
- 避免过度设计——优先使用Jetpack组件(ViewModel、LiveData)内置模式;
- 组合模式——如MVVM+Repository+观察者构建稳健架构;
- 关注生命周期——单例中避免持有View引用,防止内存泄漏。