MST

星途 面试题库

面试题:Java设计模式在大型项目中的应用

在一个复杂的Java企业级项目中,如何综合运用策略模式、工厂模式和观察者模式来优化系统架构,提高代码的可维护性和扩展性?请结合具体场景详细阐述。
36.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 策略模式

  • 场景:假设项目中有一个订单处理模块,不同类型的订单(如普通订单、促销订单、团购订单等)有不同的处理逻辑,例如计算价格、配送方式选择等。
  • 应用:定义一个订单处理策略接口 OrderProcessingStrategy,包含处理订单的方法 processOrder(Order order)。然后为每种订单类型创建具体的策略类,如 NormalOrderStrategyPromotionOrderStrategyGroupBuyOrderStrategy 实现该接口。在订单处理类 OrderProcessor 中,通过组合的方式持有一个 OrderProcessingStrategy 实例。这样,当需要处理不同类型订单时,只需更换策略实例,而无需在 OrderProcessor 中编写大量复杂的条件判断代码。
// 策略接口
interface OrderProcessingStrategy {
    void processOrder(Order order);
}

// 具体策略类
class NormalOrderStrategy implements OrderProcessingStrategy {
    @Override
    public void processOrder(Order order) {
        // 普通订单处理逻辑
    }
}

class PromotionOrderStrategy implements OrderProcessingStrategy {
    @Override
    public void processOrder(Order order) {
        // 促销订单处理逻辑
    }
}

class GroupBuyOrderStrategy implements OrderProcessingStrategy {
    @Override
    public void processOrder(Order order) {
        // 团购订单处理逻辑
    }
}

// 使用策略的类
class OrderProcessor {
    private OrderProcessingStrategy strategy;

    public OrderProcessor(OrderProcessingStrategy strategy) {
        this.strategy = strategy;
    }

    public void process(Order order) {
        strategy.processOrder(order);
    }
}
  • 好处:提高代码的可维护性,当新增订单类型时,只需创建新的策略类实现接口即可,不影响原有代码。同时增强扩展性,易于添加新的订单处理策略。

2. 工厂模式

  • 场景:结合上述订单处理场景,在创建不同类型订单处理策略实例时,如果在多个地方都手动创建实例,代码会变得重复且难以维护。
  • 应用:创建一个 OrderProcessingStrategyFactory 工厂类,使用静态方法根据订单类型返回相应的策略实例。例如:
class OrderProcessingStrategyFactory {
    public static OrderProcessingStrategy createStrategy(OrderType type) {
        switch (type) {
            case NORMAL:
                return new NormalOrderStrategy();
            case PROMOTION:
                return new PromotionOrderStrategy();
            case GROUP_BUY:
                return new GroupBuyOrderStrategy();
            default:
                throw new IllegalArgumentException("Unsupported order type");
        }
    }
}

OrderProcessor 中使用工厂类创建策略实例:

class OrderProcessor {
    private OrderProcessingStrategy strategy;

    public OrderProcessor(OrderType type) {
        this.strategy = OrderProcessingStrategyFactory.createStrategy(type);
    }

    public void process(Order order) {
        strategy.processOrder(order);
    }
}
  • 好处:将对象创建和使用分离,使得代码依赖关系更清晰。当需要修改策略实例的创建逻辑时,只需在工厂类中修改,而不会影响到使用策略的其他代码,提高了代码的可维护性和扩展性。

3. 观察者模式

  • 场景:在订单处理过程中,可能有多个模块需要关注订单状态的变化,例如库存模块需要在订单确认后减少库存,物流模块需要在订单发货时更新物流信息等。
  • 应用:定义一个 Order 类作为被观察对象,实现 Observable 接口(在Java中可使用 java.util.Observable 类,或自定义观察者模式接口)。订单状态变化时调用 setChanged()notifyObservers() 方法通知观察者。各个关注订单状态的模块(如库存模块 InventoryModule、物流模块 LogisticsModule)作为观察者实现 Observer 接口(在Java中为 java.util.Observer 接口),实现 update 方法来处理订单状态变化。
import java.util.Observable;
import java.util.Observer;

// 被观察对象
class Order extends Observable {
    private OrderStatus status;

    public void setStatus(OrderStatus status) {
        this.status = status;
        setChanged();
        notifyObservers(status);
    }
}

// 观察者接口
class InventoryModule implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof Order && arg instanceof OrderStatus) {
            OrderStatus status = (OrderStatus) arg;
            if (status == OrderStatus.CONFIRMED) {
                // 减少库存逻辑
            }
        }
    }
}

class LogisticsModule implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof Order && arg instanceof OrderStatus) {
            OrderStatus status = (OrderStatus) arg;
            if (status == OrderStatus.SHIPPED) {
                // 更新物流信息逻辑
            }
        }
    }
}
  • 好处:实现了模块之间的解耦,订单模块不需要知道具体有哪些模块关注它的状态变化,只需要在状态变化时通知观察者。各个观察者模块可以独立开发和维护,提高了系统的可维护性和扩展性,当新增关注订单状态的模块时,只需实现 Observer 接口并注册到订单对象即可。

4. 综合运用

  • 结合方式:在订单处理系统中,首先使用工厂模式创建不同订单处理策略实例,将对象创建逻辑封装起来,便于管理和扩展。然后利用策略模式,根据订单类型选择合适的处理策略,使得订单处理逻辑清晰且易于维护。同时,在订单处理过程中,通过观察者模式通知其他相关模块订单状态的变化,实现模块间的解耦,增强系统的扩展性。例如,当处理一个促销订单时,通过工厂模式获取 PromotionOrderStrategy 实例,使用策略模式执行促销订单的处理逻辑,在订单状态变化时通过观察者模式通知库存、物流等模块进行相应操作。
  • 整体优势:通过综合运用这三种设计模式,系统架构更加清晰,代码的可维护性和扩展性得到显著提高。各个模块职责明确,降低了模块间的耦合度,有利于团队开发和后期系统的升级维护。