MST

星途 面试题库

面试题:Kotlin 中结合设计模式优化复杂业务逻辑

假设你正在开发一个电商系统,订单处理流程包含多个步骤,如订单创建、库存检查、支付处理、订单发货等,每个步骤可能有不同的业务规则,并且部分步骤可能需要动态切换执行逻辑。请使用 Kotlin 结合合适的设计模式来设计和实现这个订单处理模块,说明选择这些设计模式的原因,并阐述如何通过这些设计模式来提高代码的可维护性和扩展性。
35.0万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

设计模式选择及原因

  1. 策略模式
    • 原因:由于部分步骤可能需要动态切换执行逻辑,策略模式可以将不同的执行逻辑封装成不同的策略类,在运行时根据具体情况选择合适的策略。例如对于支付处理步骤,可能有多种支付方式(如支付宝、微信支付等),每种支付方式就是一个具体的策略。这样可以将支付逻辑与订单处理的其他部分解耦,方便添加新的支付方式或修改现有支付方式的逻辑。
  2. 责任链模式
    • 原因:订单处理流程包含多个步骤,每个步骤都有自己的业务规则,责任链模式可以将这些步骤连接成一条链,每个步骤负责处理请求,如果该步骤无法处理则将请求传递给下一个步骤。例如订单创建后,传递给库存检查步骤,库存检查通过后再传递给支付处理步骤等。这种方式使得代码结构更加清晰,每个步骤专注于自己的业务逻辑,并且可以方便地添加或移除步骤。

Kotlin 代码实现示例

  1. 策略模式实现支付处理
    // 支付策略接口
    interface PaymentStrategy {
        fun processPayment(amount: Double): Boolean
    }
    
    // 支付宝支付策略
    class AlipayPaymentStrategy : PaymentStrategy {
        override fun processPayment(amount: Double): Boolean {
            // 模拟支付宝支付逻辑
            println("Processing payment of $amount using Alipay")
            return true
        }
    }
    
    // 微信支付策略
    class WechatPaymentStrategy : PaymentStrategy {
        override fun processPayment(amount: Double): Boolean {
            // 模拟微信支付逻辑
            println("Processing payment of $amount using Wechat")
            return true
        }
    }
    
    // 订单类,包含支付策略
    class Order(private val amount: Double, private val paymentStrategy: PaymentStrategy) {
        fun processOrder() {
            if (paymentStrategy.processPayment(amount)) {
                println("Order processed successfully.")
            } else {
                println("Payment failed.")
            }
        }
    }
    
  2. 责任链模式实现订单处理流程
    // 订单处理步骤抽象类
    abstract class OrderHandler {
        protected var nextHandler: OrderHandler? = null
    
        fun setNext(handler: OrderHandler): OrderHandler {
            this.nextHandler = handler
            return handler
        }
    
        abstract fun handle(order: Order)
    }
    
    // 订单创建步骤
    class OrderCreationHandler : OrderHandler() {
        override fun handle(order: Order) {
            println("Order created.")
            nextHandler?.handle(order)
        }
    }
    
    // 库存检查步骤
    class InventoryCheckHandler : OrderHandler() {
        override fun handle(order: Order) {
            println("Inventory checked.")
            nextHandler?.handle(order)
        }
    }
    
    // 支付处理步骤
    class PaymentHandler(private val paymentStrategy: PaymentStrategy) : OrderHandler() {
        override fun handle(order: Order) {
            if (paymentStrategy.processPayment(order.amount)) {
                println("Payment processed.")
                nextHandler?.handle(order)
            } else {
                println("Payment failed.")
            }
        }
    }
    
    // 订单发货步骤
    class OrderShippingHandler : OrderHandler() {
        override fun handle(order: Order) {
            println("Order shipped.")
        }
    }
    

提高代码可维护性和扩展性

  1. 可维护性
    • 策略模式:每个具体策略类负责自己的逻辑,当需要修改某个支付方式的逻辑时,只需要修改对应的策略类,不会影响到其他部分的代码。例如修改支付宝支付逻辑,只需要在 AlipayPaymentStrategy 类中修改 processPayment 方法即可。
    • 责任链模式:每个步骤类独立处理自己的业务逻辑,步骤之间通过责任链连接。如果某个步骤的业务规则发生变化,只需要修改该步骤对应的类,不会影响到其他步骤。例如库存检查规则变化,只需要修改 InventoryCheckHandler 类。
  2. 扩展性
    • 策略模式:添加新的支付方式非常容易,只需要创建一个新的实现 PaymentStrategy 接口的类即可。例如添加银联支付方式,创建 UnionPayPaymentStrategy 类并实现 processPayment 方法,然后在使用处可以方便地切换使用银联支付策略。
    • 责任链模式:添加新的订单处理步骤也很方便,只需要创建一个新的继承自 OrderHandler 的类,实现 handle 方法,并将其加入到责任链中。例如添加订单审核步骤,创建 OrderReviewHandler 类并在需要的地方将其插入到责任链合适位置。