MST

星途 面试题库

面试题:Java中策略模式与状态模式的区别及在复杂业务场景中的选择

详细说明Java中策略模式和状态模式的结构、功能特点,分析两者的区别。假设你正在开发一个电商系统的促销模块,不同促销活动(如满减、折扣、赠品)和商品的不同状态(如在售、下架、预订中)都涉及到复杂的业务逻辑,你会在哪些场景选择策略模式,哪些场景选择状态模式,为什么?
21.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

策略模式

  1. 结构
    • 抽象策略(Strategy):定义了一个公共接口,所有具体策略类都实现这个接口。
    • 具体策略(Concrete Strategy):实现抽象策略接口,封装具体的算法或行为。
    • 上下文(Context):持有一个抽象策略的引用,通过构造函数或setter方法将具体策略对象传入,调用策略对象的方法来执行具体行为。
  2. 功能特点
    • 行为封装:将不同的算法或行为封装到各自的策略类中,使得它们可以相互替换。
    • 解耦:避免了在一个类中使用大量的条件判断语句,将算法的选择和使用与具体实现分离,提高了代码的可维护性和可扩展性。
    • 增强灵活性:可以在运行时动态切换策略,根据不同的情况选择不同的算法。

状态模式

  1. 结构
    • 抽象状态(State):定义了一个接口,包含了所有具体状态类都需要实现的方法,这些方法对应在不同状态下对象的行为。
    • 具体状态(Concrete State):实现抽象状态接口,实现具体状态下的行为逻辑。
    • 环境(Context):持有一个抽象状态的引用,它的行为会随着内部状态对象的改变而改变,环境类通过调用状态对象的方法来完成特定行为,并且可以在内部状态发生变化时切换状态对象。
  2. 功能特点
    • 状态驱动:对象的行为取决于它当前所处的状态,不同状态下有不同的行为实现。
    • 状态封装:将每个状态的行为封装到对应的具体状态类中,使得状态相关的逻辑与环境类解耦。
    • 状态转换:可以在状态类内部或环境类中定义状态转换的逻辑,使得对象在不同状态之间的转换更加清晰和可控。

两者区别

  1. 关注点不同
    • 策略模式:关注的是不同算法或行为的切换,重点在于行为的封装和替换,以满足不同的业务需求。
    • 状态模式:关注的是对象状态的变化以及在不同状态下的行为表现,重点在于状态的管理和状态驱动的行为。
  2. 状态管理
    • 策略模式:上下文对象本身不管理状态,它只是选择并调用不同的策略。策略之间的切换通常由外部决定。
    • 状态模式:上下文对象自身管理状态,状态的切换通常是在对象内部根据一定条件自动发生的。
  3. 行为变化
    • 策略模式:不同策略之间的行为可能差异较大,它们可能是完全不同的算法。
    • 状态模式:不同状态下的行为通常是相关的,是对象在不同阶段的不同表现。

电商系统场景选择

  1. 策略模式场景
    • 不同促销活动:如满减、折扣、赠品。因为这些促销活动是不同的算法或行为,它们之间相对独立,并且可以在运行时根据不同的促销规则进行动态切换。例如,在某个时间段选择满减策略,在另一个时间段选择折扣策略。电商系统的促销模块可以将每种促销活动实现为一个具体策略类,上下文类根据当前促销配置选择并调用相应的策略。
  2. 状态模式场景
    • 商品的不同状态:如在售、下架、预订中。商品的行为取决于其当前状态,并且状态的转换有一定的逻辑。例如,在售状态下可以进行购买操作,下架状态下不能购买,预订中状态有预订相关的行为。状态的转换,如从在售到下架可能是由于库存不足等原因自动触发。所以使用状态模式可以将商品在不同状态下的行为封装到具体状态类中,商品对象(上下文)根据自身状态变化调用相应状态类的方法,实现状态驱动的行为。