面试题答案
一键面试- 策略模式设计
- 首先定义折扣计算策略的接口:
interface DiscountStrategy {
fun calculateDiscount(price: Double): Double
}
- 然后分别实现不同会员等级的折扣策略:
class NormalMemberDiscount : DiscountStrategy {
override fun calculateDiscount(price: Double): Double {
return price * 0.95 // 普通会员95折
}
}
class PremiumMemberDiscount : DiscountStrategy {
override fun calculateDiscount(price: Double): Double {
return price * 0.9 // 高级会员9折
}
}
class VIPMemberDiscount : DiscountStrategy {
override fun calculateDiscount(price: Double): Double {
return price * 0.8 // VIP会员8折
}
}
- 接着在电商系统中使用这些策略:
class EcommerceSystem {
private lateinit var discountStrategy: DiscountStrategy
fun setDiscountStrategy(strategy: DiscountStrategy) {
this.discountStrategy = strategy
}
fun calculateFinalPrice(originalPrice: Double): Double {
return discountStrategy.calculateDiscount(originalPrice)
}
}
- 利用函数式编程特性优化
- 在Kotlin中,可以使用高阶函数来简化策略模式。首先,将折扣计算逻辑定义为高阶函数:
typealias DiscountCalculator = (Double) -> Double
val normalMemberDiscount: DiscountCalculator = { price -> price * 0.95 }
val premiumMemberDiscount: DiscountCalculator = { price -> price * 0.9 }
val vipMemberDiscount: DiscountCalculator = { price -> price * 0.8 }
- 然后修改电商系统,使用高阶函数作为策略:
class EcommerceSystem {
private lateinit var discountCalculator: DiscountCalculator
fun setDiscountCalculator(calculator: DiscountCalculator) {
this.discountCalculator = calculator
}
fun calculateFinalPrice(originalPrice: Double): Double {
return discountCalculator(originalPrice)
}
}
这样做的好处是:
- 提高可维护性:高阶函数的定义更简洁,逻辑更清晰,当折扣策略发生变化时,只需修改对应的高阶函数即可,无需在类层次结构中进行复杂的修改。
- 提高扩展性:如果要新增一种会员等级的折扣策略,只需定义一个新的高阶函数,并在需要使用的地方传入即可,无需创建新的类并继承接口,代码的侵入性更小。