MST

星途 面试题库

面试题:Kotlin委托模式在Android架构中的常见应用场景有哪些

请阐述Kotlin委托模式在Android架构,比如MVC、MVP或MVVM模式中,有哪些常见的应用场景,并举例说明如何通过委托模式优化代码结构和实现解耦。
15.3万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

常见应用场景及优化解耦方式

1. 在MVP模式中

  • 场景:Presenter层可能会有一些通用的业务逻辑,例如网络请求的处理逻辑。不同的Presenter可能会复用这部分逻辑。
  • 优化解耦示例
    • 首先定义一个网络请求委托接口 NetworkRequestDelegate
interface NetworkRequestDelegate {
    fun performNetworkRequest(url: String): String
}
- 然后创建一个默认的委托实现类 `DefaultNetworkRequestDelegate`:
class DefaultNetworkRequestDelegate : NetworkRequestDelegate {
    override fun performNetworkRequest(url: String): String {
        // 实际的网络请求逻辑,例如使用OkHttp等库
        return "Response from $url"
    }
}
- 在Presenter中使用委托模式:
class LoginPresenter(private val view: LoginView, private val delegate: NetworkRequestDelegate = DefaultNetworkRequestDelegate()) {
    fun login(username: String, password: String) {
        val response = delegate.performNetworkRequest("http://example.com/login?username=$username&password=$password")
        if (response.contains("success")) {
            view.showLoginSuccess()
        } else {
            view.showLoginFailure()
        }
    }
}

这样Presenter的网络请求逻辑与具体实现解耦,便于复用和测试。

2. 在MVVM模式中

  • 场景:ViewModel中数据的获取和处理有时会涉及到重复的逻辑,如数据的缓存管理。
  • 优化解耦示例
    • 定义缓存委托接口 DataCacheDelegate
interface DataCacheDelegate<T> {
    fun getFromCache(key: String): T?
    fun saveToCache(key: String, value: T)
}
- 创建一个简单的内存缓存委托实现 `MemoryCacheDelegate`:
class MemoryCacheDelegate<T> : DataCacheDelegate<T> {
    private val cache = mutableMapOf<String, T>()
    override fun getFromCache(key: String): T? = cache[key]
    override fun saveToCache(key: String, value: T) {
        cache[key] = value
    }
}
- 在ViewModel中使用委托:
class UserViewModel(private val cacheDelegate: DataCacheDelegate<User> = MemoryCacheDelegate()) {
    fun getUserData(userId: String): User? {
        var user = cacheDelegate.getFromCache(userId)
        if (user == null) {
            // 从网络获取数据
            user = fetchUserFromNetwork(userId)
            cacheDelegate.saveToCache(userId, user)
        }
        return user
    }

    private fun fetchUserFromNetwork(userId: String): User {
        // 实际网络获取逻辑
        return User("John Doe", 30)
    }
}

通过这种方式,ViewModel的数据缓存逻辑与其他业务逻辑分离,提高了代码的可维护性和可测试性。

3. 在MVC模式中

  • 场景:Controller层可能需要复用一些通用的验证逻辑,比如用户输入的合法性验证。
  • 优化解耦示例
    • 定义验证委托接口 InputValidationDelegate
interface InputValidationDelegate {
    fun validateEmail(email: String): Boolean
    fun validatePassword(password: String): Boolean
}
- 创建一个默认的验证委托实现 `DefaultInputValidationDelegate`:
class DefaultInputValidationDelegate : InputValidationDelegate {
    override fun validateEmail(email: String): Boolean {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()
    }

    override fun validatePassword(password: String): Boolean {
        return password.length >= 6
    }
}
- 在Controller中使用委托:
class UserController(private val model: UserModel, private val view: UserView, private val validationDelegate: InputValidationDelegate = DefaultInputValidationDelegate()) {
    fun registerUser(email: String, password: String) {
        if (validationDelegate.validateEmail(email) && validationDelegate.validatePassword(password)) {
            model.registerUser(email, password)
            view.showRegistrationSuccess()
        } else {
            view.showRegistrationFailure()
        }
    }
}

这使得Controller层的验证逻辑独立出来,便于修改和复用,实现了代码结构的优化和解耦。