面试题答案
一键面试- 策略概述
- 抽象日志接口:定义一个统一的日志接口,各平台实现该接口以提供具体的日志功能。这样在业务代码中可以统一调用该接口,而无需关心具体平台实现。
- 使用工厂模式:通过工厂模式创建日志记录器实例,根据当前运行平台返回相应平台的日志记录器实现。
- 配置文件或常量:使用配置文件或常量来定义各平台特定的日志格式,方便在不同平台上调整格式。
- 代码结构示例
- 定义统一日志接口:
interface Logger {
fun debug(message: String)
fun info(message: String)
fun error(message: String, throwable: Throwable? = null)
}
- Android平台实现:
class AndroidLogger : Logger {
override fun debug(message: String) {
android.util.Log.d("MyApp", message)
}
override fun info(message: String) {
android.util.Log.i("MyApp", message)
}
override fun error(message: String, throwable: Throwable? = null) {
if (throwable == null) {
android.util.Log.e("MyApp", message)
} else {
android.util.Log.e("MyApp", message, throwable)
}
}
}
- iOS平台实现(假设使用某种跨平台框架可调用iOS日志):
class IosLogger : Logger {
override fun debug(message: String) {
// 调用iOS日志记录函数记录debug信息
println("DEBUG: $message")
}
override fun info(message: String) {
// 调用iOS日志记录函数记录info信息
println("INFO: $message")
}
override fun error(message: String, throwable: Throwable? = null) {
if (throwable == null) {
// 调用iOS日志记录函数记录error信息
println("ERROR: $message")
} else {
// 调用iOS日志记录函数记录error信息及异常
println("ERROR: $message ${throwable.message}")
}
}
}
- 日志工厂:
object LoggerFactory {
fun createLogger(): Logger {
return when {
Platform.isAndroid -> AndroidLogger()
Platform.isiOS -> IosLogger()
else -> throw UnsupportedOperationException("Unsupported platform")
}
}
}
- 业务代码使用:
fun main() {
val logger = LoggerFactory.createLogger()
logger.info("This is an info message")
try {
// 一些可能抛出异常的代码
throw RuntimeException("Sample exception")
} catch (e: RuntimeException) {
logger.error("An error occurred", e)
}
}
- 处理日志格式差异: 可以在各平台的日志实现类中,根据配置文件或常量来格式化日志消息。例如在Android平台:
class AndroidLogger : Logger {
private val logFormat = "%s - %s" // 时间 - 消息格式,可从配置文件读取
override fun debug(message: String) {
val formattedMessage = String.format(logFormat, System.currentTimeMillis(), message)
android.util.Log.d("MyApp", formattedMessage)
}
// info和error方法类似处理
}
在iOS平台也可以类似根据自己的配置来格式化日志消息。通过这种方式,既实现了统一的日志接口调用,又满足了各平台特定的日志格式要求。