面试题答案
一键面试利用委托模式实现依赖注入
- 定义接口和实现类
// 定义接口 interface MessageService { fun sendMessage(message: String): Boolean } // 接口的具体实现类 class EmailService : MessageService { override fun sendMessage(message: String): Boolean { println("Sending email: $message") return true } }
- 使用委托模式进行依赖注入
class User(val name: String) { private lateinit var messageService: MessageService // 委托注入依赖的方法 fun setMessageService(service: MessageService) { messageService = service } fun sendUserMessage(message: String) { messageService.sendMessage("$name says: $message") } }
- 使用示例
fun main() { val user = User("John") val emailService = EmailService() user.setMessageService(emailService) user.sendUserMessage("Hello, world!") }
优势
- 灵活性
- 传统依赖注入方式(如构造函数注入)在对象创建时就确定了依赖关系,一旦创建后难以改变。而委托模式下,对象可以在运行时动态改变依赖。例如上述代码中,
User
对象可以在运行时通过setMessageService
方法切换不同的MessageService
实现。
- 传统依赖注入方式(如构造函数注入)在对象创建时就确定了依赖关系,一旦创建后难以改变。而委托模式下,对象可以在运行时动态改变依赖。例如上述代码中,
- 降低耦合度
- 委托模式使得依赖关系更加松散。
User
类并不直接依赖于具体的EmailService
类,而只是依赖于MessageService
接口。这意味着可以很容易地替换成其他实现类,如SmsService
,而不需要修改User
类的代码。相比之下,传统依赖注入如果要更换实现类,可能需要修改构造函数等多处代码。
- 委托模式使得依赖关系更加松散。
- 代码简洁性
- 委托模式实现依赖注入相对简洁明了。通过简单的委托方法(如
setMessageService
),就可以实现依赖的注入,不需要复杂的框架或注解。而传统依赖注入在使用一些框架(如Dagger)时,可能需要编写大量的配置代码。
- 委托模式实现依赖注入相对简洁明了。通过简单的委托方法(如