面试题答案
一键面试1. 策略模式
- 场景:假设项目中有一个订单处理模块,不同类型的订单(如普通订单、促销订单、团购订单等)有不同的处理逻辑,例如计算价格、配送方式选择等。
- 应用:定义一个订单处理策略接口
OrderProcessingStrategy
,包含处理订单的方法processOrder(Order order)
。然后为每种订单类型创建具体的策略类,如NormalOrderStrategy
、PromotionOrderStrategy
、GroupBuyOrderStrategy
实现该接口。在订单处理类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
实例,使用策略模式执行促销订单的处理逻辑,在订单状态变化时通过观察者模式通知库存、物流等模块进行相应操作。 - 整体优势:通过综合运用这三种设计模式,系统架构更加清晰,代码的可维护性和扩展性得到显著提高。各个模块职责明确,降低了模块间的耦合度,有利于团队开发和后期系统的升级维护。