面试题答案
一键面试1. 构建器模式与DSL结合的优势
提高代码可读性
通过DSL,代码可以以一种更接近自然语言的方式编写,直观地表达订单生成的过程。例如,开发者可以像描述实际业务一样,按顺序指定用户信息、商品列表、配送地址和支付方式等,而无需关注复杂的对象创建细节。
提高代码可维护性
构建器模式将对象的构建过程封装起来,每个部分的构建逻辑可以独立修改和扩展。当业务规则(如满减优惠、会员折扣)发生变化时,只需在构建器的相应方法中进行修改,不会影响到其他部分的代码。DSL进一步增强了这种模块化,使得业务逻辑更加清晰,易于理解和维护。
2. 核心代码示例
// 定义订单数据类
data class Order(
val userInfo: UserInfo,
val productList: List<Product>,
val shippingAddress: String,
val paymentMethod: String,
val discount: Double = 0.0
)
data class UserInfo(val name: String, val email: String)
data class Product(val name: String, val price: Double)
// 订单构建器
class OrderBuilder {
private lateinit var userInfo: UserInfo
private val productList = mutableListOf<Product>()
private lateinit var shippingAddress: String
private lateinit var paymentMethod: String
private var discount: Double = 0.0
fun userInfo(block: UserInfo.() -> Unit) {
userInfo = UserInfo("default", "default@example.com").apply(block)
}
fun productList(block: MutableList<Product>.() -> Unit) {
productList.apply(block)
}
fun shippingAddress(address: String) {
shippingAddress = address
}
fun paymentMethod(method: String) {
paymentMethod = method
}
fun applyDiscount(amount: Double) {
discount = amount
}
fun build(): Order {
return Order(userInfo, productList, shippingAddress, paymentMethod, discount)
}
}
// DSL扩展函数
fun order(block: OrderBuilder.() -> Unit): Order {
val builder = OrderBuilder()
builder.apply(block)
return builder.build()
}
fun main() {
val order = order {
userInfo {
name = "John Doe"
email = "john@example.com"
}
productList {
add(Product("Laptop", 1000.0))
add(Product("Mouse", 50.0))
}
shippingAddress = "123, Main St"
paymentMethod = "Credit Card"
applyDiscount(100.0)
}
println(order)
}
在上述代码中:
Order
数据类定义了订单所需的各种信息。OrderBuilder
类负责构建Order
对象,每个属性都有对应的设置方法。- 通过
order
扩展函数,使用DSL风格来调用OrderBuilder
的方法,使得订单生成的代码更易读和维护。例如,在main
函数中,以一种类似自然语言的方式创建了一个订单对象。