MST

星途 面试题库

面试题:Java状态模式与其他设计模式的组合应用

在实际的Java项目开发中,状态模式经常会与其他设计模式组合使用以满足复杂的业务需求。请举例说明状态模式可以与哪些设计模式结合,以及在具体场景下这样组合使用能够解决什么问题,带来哪些优势?要求结合代码示例详细阐述。
26.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 状态模式与策略模式
    • 结合场景:在电商订单系统中,订单有不同的状态(如待支付、已支付、已发货等),同时对于不同状态下的订单处理逻辑,可能有多种策略。例如,待支付订单可以有不同的支付策略(支付宝支付、微信支付等)。
    • 解决问题:通过结合状态模式和策略模式,可以在不同订单状态下灵活切换支付策略,使系统更具可维护性和扩展性。
    • 优势:将订单状态管理和支付策略管理分离,降低代码耦合度,便于新增订单状态或支付策略。
    • 代码示例
// 策略接口
interface PaymentStrategy {
    void pay(double amount);
}

// 具体策略类
class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付:" + amount + "元");
    }
}

class WeChatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付:" + amount + "元");
    }
}

// 状态接口
interface OrderState {
    void handle(Order order);
}

// 具体状态类 - 待支付状态
class PendingPaymentState implements OrderState {
    private PaymentStrategy paymentStrategy;

    public PendingPaymentState(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    @Override
    public void handle(Order order) {
        System.out.println("订单处于待支付状态");
        paymentStrategy.pay(order.getAmount());
    }
}

// 订单类
class Order {
    private double amount;
    private OrderState state;

    public Order(double amount) {
        this.amount = amount;
        this.state = new PendingPaymentState(new AlipayStrategy());
    }

    public void setState(OrderState state) {
        this.state = state;
    }

    public double getAmount() {
        return amount;
    }

    public void handle() {
        state.handle(this);
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Order order = new Order(100);
        order.handle();
        order.setState(new PendingPaymentState(new WeChatPayStrategy()));
        order.handle();
    }
}
  1. 状态模式与工厂模式
    • 结合场景:在游戏角色状态管理系统中,角色有多种状态(如正常、中毒、隐身等),每种状态有不同的行为。可以使用工厂模式来创建不同的状态对象。
    • 解决问题:简化状态对象的创建过程,提高代码的可维护性和复用性。当需要新增状态时,只需在工厂类中添加创建逻辑。
    • 优势:将状态对象的创建和使用分离,使得代码结构更清晰,便于集中管理状态对象的创建。
    • 代码示例
// 状态接口
interface CharacterState {
    void action();
}

// 具体状态类 - 正常状态
class NormalState implements CharacterState {
    @Override
    public void action() {
        System.out.println("角色处于正常状态,正常行动");
    }
}

// 具体状态类 - 中毒状态
class PoisonedState implements CharacterState {
    @Override
    public void action() {
        System.out.println("角色中毒,持续掉血");
    }
}

// 状态工厂类
class StateFactory {
    public static CharacterState getState(String stateType) {
        if ("normal".equals(stateType)) {
            return new NormalState();
        } else if ("poisoned".equals(stateType)) {
            return new PoisonedState();
        }
        return null;
    }
}

// 角色类
class Character {
    private CharacterState state;

    public Character() {
        this.state = StateFactory.getState("normal");
    }

    public void setState(CharacterState state) {
        this.state = state;
    }

    public void performAction() {
        state.action();
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Character character = new Character();
        character.performAction();
        character.setState(StateFactory.getState("poisoned"));
        character.performAction();
    }
}