面试题答案
一键面试设计模式选择及原因
- 策略模式:
- 原因:由于部分步骤可能需要动态切换执行逻辑,策略模式可以将不同的执行逻辑封装成不同的策略类,在运行时根据具体情况选择合适的策略。例如对于支付处理步骤,可能有多种支付方式(如支付宝、微信支付等),每种支付方式就是一个具体的策略。这样可以将支付逻辑与订单处理的其他部分解耦,方便添加新的支付方式或修改现有支付方式的逻辑。
- 责任链模式:
- 原因:订单处理流程包含多个步骤,每个步骤都有自己的业务规则,责任链模式可以将这些步骤连接成一条链,每个步骤负责处理请求,如果该步骤无法处理则将请求传递给下一个步骤。例如订单创建后,传递给库存检查步骤,库存检查通过后再传递给支付处理步骤等。这种方式使得代码结构更加清晰,每个步骤专注于自己的业务逻辑,并且可以方便地添加或移除步骤。
Kotlin 代码实现示例
- 策略模式实现支付处理:
// 支付策略接口 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.") } } }
- 责任链模式实现订单处理流程:
// 订单处理步骤抽象类 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.") } }
提高代码可维护性和扩展性
- 可维护性:
- 策略模式:每个具体策略类负责自己的逻辑,当需要修改某个支付方式的逻辑时,只需要修改对应的策略类,不会影响到其他部分的代码。例如修改支付宝支付逻辑,只需要在
AlipayPaymentStrategy
类中修改processPayment
方法即可。 - 责任链模式:每个步骤类独立处理自己的业务逻辑,步骤之间通过责任链连接。如果某个步骤的业务规则发生变化,只需要修改该步骤对应的类,不会影响到其他步骤。例如库存检查规则变化,只需要修改
InventoryCheckHandler
类。
- 策略模式:每个具体策略类负责自己的逻辑,当需要修改某个支付方式的逻辑时,只需要修改对应的策略类,不会影响到其他部分的代码。例如修改支付宝支付逻辑,只需要在
- 扩展性:
- 策略模式:添加新的支付方式非常容易,只需要创建一个新的实现
PaymentStrategy
接口的类即可。例如添加银联支付方式,创建UnionPayPaymentStrategy
类并实现processPayment
方法,然后在使用处可以方便地切换使用银联支付策略。 - 责任链模式:添加新的订单处理步骤也很方便,只需要创建一个新的继承自
OrderHandler
的类,实现handle
方法,并将其加入到责任链中。例如添加订单审核步骤,创建OrderReviewHandler
类并在需要的地方将其插入到责任链合适位置。
- 策略模式:添加新的支付方式非常容易,只需要创建一个新的实现