面试题答案
一键面试常见应用场景及优化解耦方式
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层的验证逻辑独立出来,便于修改和复用,实现了代码结构的优化和解耦。