作为一名 Android 开发者,要构建出健壮、可扩展且易于维护的应用,熟练掌握设计模式是至关重要的。设计模式并非现成的库,而是经过实践检验、可复用的软件设计蓝图。今天,我们将重点介绍 Android 开发中最常用的五种设计模式,并通过 Kotlin 代码展示它们的实际应用。1. 建造者模式 (Builder Pattern)
核心思想建造者模式是一种创建型模式,用于分步骤构建复杂对象。它将对象的构造逻辑与其表示分离,使得同样的构造过程可以创建不同的表示。这在对象构造参数较多,尤其是许多参数为可选或需要特定配置时特别有用。
Android 中的典型应用场景
AlertDialog 构建:告别繁琐的 set 方法链
Retrofit 构建:优雅配置 HTTP 客户端
Notification 构建:分步骤创建复杂的通知
Kotlin 实现示例
class User private constructor( val name: String, val age: Int?, val email: String?) { class Builder(private val name: String) { private var age: Int? = null private var email: String? = null funsetAge(age: Int) = apply { this.age = age } funsetEmail(email: String) = apply { this.email = email } funbuild() = User(name, age, email) }}// 使用示例val user = User.Builder("张三") .setAge(25) .setEmail("zhangsan@example.com") .build()
2. 观察者模式 (Observer Pattern)
核心思想观察者模式定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动收到通知并更新。
Android 中的典型应用场景
Kotlin 实现示例
// 简化版 LiveData 实现class SimpleLiveData<T> { private val observers = mutableListOf<(T) -> Unit>() private var value: T? = null funobserve(observer: (T) -> Unit) { observers.add(observer) value?.let { observer(it) } } funsetValue(newValue: T) { value = newValue observers.forEach { it(newValue) } }}
3. 单例模式 (Singleton Pattern)
核心思想确保一个类只有一个实例,并提供一个全局访问点。
Android 中的典型应用场景
Kotlin 实现示例
// 1. object 关键字(推荐方式)object Singleton1 { fundoSomething() {}}// 2. 伴生对象 + lazyclass Singleton2 private constructor() { companion object { val instance: Singleton2 by lazy { Singleton2() } }}// 3. 双重检查锁定class Singleton3 private constructor() { companion object { @Volatile private var instance: Singleton3? = null fungetInstance(): Singleton3 = instance ?: synchronized(this) { instance ?: Singleton3().also { instance = it } } }}
4. 适配器模式 (Adapter Pattern)
核心思想将一个类的接口转换成客户端期望的另一个接口,使原本因接口不兼容而无法协同工作的类能够一起工作。
Android 中的典型应用场景
Kotlin 实现示例
class UserAdapter(private val users: List<User>) : RecyclerView.Adapter<UserAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val nameView: TextView = view.findViewById(R.id.name) val ageView: TextView = view.findViewById(R.id.age) } override funonCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.user_item, parent, false) return ViewHolder(view) } override funonBindViewHolder(holder: ViewHolder, position: Int) { val user = users[position] holder.nameView.text = user.name holder.ageView.text = user.age.toString() } override fungetItemCount() = users.size}
5. 策略模式 (Strategy Pattern)
核心思想定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。
Android 中的典型应用场景
支付方式选择:支付宝、微信、信用卡等不同策略
图片加载策略:根据网络状况选择不同加载方式
数据缓存策略:内存缓存、磁盘缓存、网络获取等
Kotlin 实现示例
interface PaymentStrategy { funpay(amount: Double): Boolean}class AlipayStrategy : PaymentStrategy { override funpay(amount: Double): Boolean { println("使用支付宝支付 $amount 元") return true }}class WechatPayStrategy : PaymentStrategy { override funpay(amount: Double): Boolean { println("使用微信支付 $amount 元") return true }}class PaymentContext(private var strategy: PaymentStrategy) { funexecutePayment(amount: Double) = strategy.pay(amount) funsetStrategy(newStrategy: PaymentStrategy) { strategy = newStrategy }}// 使用示例val context = PaymentContext(AlipayStrategy())context.executePayment(100.0) // 使用支付宝支付context.setStrategy(WechatPayStrategy())context.executePayment(200.0) // 切换到微信支付
总结
熟练掌握这些设计模式,将显著提升你的 Android 代码质量:
建造者模式 - 优雅构建复杂对象
观察者模式 - 实现松耦合的组件通信
单例模式 - 合理管理全局唯一实例
适配器模式 - 解决接口兼容性问题
策略模式 - 灵活切换算法实现
需要注意的是,设计模式并非万能钥匙,应根据实际场景合理选择。过度使用设计模式反而会使代码变得复杂难懂。希望这些示例能帮助你在实际开发中编写出更加优雅、易于维护的 Android 代码!