江明涛的博客
职责链模式的实际案例
职责链模式的实际案例

职责链模式的实际案例

职责链模式是一种行为型设计模式,用于处理一个请求可能由多个对象来处理的情况。职责链模式将这些对象组成一个链,并且每个对象都有机会对请求进行处理或者将其传递给下一个对象。

下面我们来看一个实际案例,假设我们正在开发一个在线购物网站,我们需要实现一个订单处理系统,其中涉及到不同的步骤,比如验证订单、计算价格、处理库存等。我们可以使用职责链模式来优雅地处理这些步骤。

首先,我们需要定义一个抽象处理器(Handler)类,该类包含处理请求的方法以及一个指向下一个处理器的引用:

public abstract class Handler {
    protected Handler nextHandler;
    
    public Handler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    
    public abstract void process(Order order);
}

然后,我们可以创建具体的处理器类,比如验证订单的处理器、计算价格的处理器和处理库存的处理器等:

public class ValidateOrderHandler extends Handler {
    public ValidateOrderHandler(Handler nextHandler) {
        super(nextHandler);
    }
    
    public void process(Order order) {
        // 验证订单的逻辑
        if (order.isValid()) {
            // 如果订单有效,将请求传递给下一个处理器
            nextHandler.process(order);
        } else {
            // 如果订单无效,结束处理
            System.out.println("订单无效,处理结束。");
        }
    }
}
public class CalculatePriceHandler extends Handler {
    public CalculatePriceHandler(Handler nextHandler) {
        super(nextHandler);
    }
    
    public void process(Order order) {
        // 计算价格的逻辑
        order.setPrice(100); // 假设价格为100
        // 将请求传递给下一个处理器
        nextHandler.process(order);
    }
}
public class ProcessInventoryHandler extends Handler {
    public ProcessInventoryHandler(Handler nextHandler) {
        super(nextHandler);
    }
    
    public void process(Order order) {
        // 处理库存的逻辑
        // 将请求传递给下一个处理器
        nextHandler.process(order);
    }
}
// ...其他具体处理器类

最后,我们需要创建一个订单处理链,并将订单对象传递给链的第一个处理器来启动整个处理过程:

public class OrderProcessor {
    private Handler chain;
    
    public OrderProcessor() {
        // 创建处理器链
        this.chain = new ValidateOrderHandler(new CalculatePriceHandler(new ProcessInventoryHandler(null)));
    }
    
    public void processOrder(Order order) {
        // 启动处理链
        chain.process(order);
    }
}
public class Order {
    private boolean isValid;
    private double price;
    
    // ...省略其他属性和方法的定义
    
    public boolean isValid() {
        return isValid;
    }
    
    public double getPrice() {
        return price;
    }
    
    public void setPrice(double price) {
        this.price = price;
    }
}
public class Main {
    public static void main(String[] args) {
        OrderProcessor orderProcessor = new OrderProcessor();
        Order order = new Order();
        order.setValid(true); // 假设订单有效
        orderProcessor.processOrder(order);
        System.out.println("订单价格:" + order.getPrice());
    }
}

在上述代码中,我们创建了一个订单处理链,其中包含了验证订单的处理器、计算价格的处理器和处理库存的处理器。当调用订单处理器的processOrder方法时,订单对象将依次经过处理器链中的每个处理器进行处理。在本例中,如果订单有效,我们可以看到订单价格被计算为100,否则处理将以无效订单结束。

职责链模式通过将请求的发送者和接收者解耦,有助于在不同的场景中实现灵活和可扩展的处理流程。在上述案例中,我们可以根据需要添加或修改处理器,而不需要改变整个处理流程。

通过使用职责链模式,我们可以提高代码的可维护性和可测试性,使系统更具弹性和容错性。