返回

从职责链看电商购物优惠模式的应用

前端

职责链模式是一种设计模式,它允许您将请求沿着链式结构传递,直到找到可以处理请求的组件。这种模式可以使您的代码更具模块化和可扩展性,因为它允许您在不修改现有代码的情况下添加新组件。

在电商购物中,职责链模式可以用于构建一个灵活的优惠系统。例如,我们可以定义一个基类DiscountHandler,它包含处理折扣请求的通用方法。然后,我们可以创建多个子类来处理不同类型的折扣,例如FixedDiscountHandlerPercentageDiscountHandler

class DiscountHandler {
    public next: DiscountHandler | null = null;

    public handle(request: DiscountRequest): DiscountResponse | null {
        if (this.canHandle(request)) {
            return this.applyDiscount(request);
        } else if (this.next) {
            return this.next.handle(request);
        } else {
            return null;
        }
    }

    protected canHandle(request: DiscountRequest): boolean {
        return false;
    }

    protected applyDiscount(request: DiscountRequest): DiscountResponse {
        return {
            discountAmount: 0,
            discountedPrice: request.originalPrice,
        };
    }
}

class FixedDiscountHandler extends DiscountHandler {
    private fixedDiscountAmount: number;

    constructor(fixedDiscountAmount: number) {
        super();
        this.fixedDiscountAmount = fixedDiscountAmount;
    }

    protected canHandle(request: DiscountRequest): boolean {
        return true;
    }

    protected applyDiscount(request: DiscountRequest): DiscountResponse {
        const discountAmount = Math.min(this.fixedDiscountAmount, request.originalPrice);
        const discountedPrice = request.originalPrice - discountAmount;

        return {
            discountAmount,
            discountedPrice,
        };
    }
}

class PercentageDiscountHandler extends DiscountHandler {
    private percentageDiscount: number;

    constructor(percentageDiscount: number) {
        super();
        this.percentageDiscount = percentageDiscount;
    }

    protected canHandle(request: DiscountRequest): boolean {
        return true;
    }

    protected applyDiscount(request: DiscountRequest): DiscountResponse {
        const discountAmount = request.originalPrice * this.percentageDiscount;
        const discountedPrice = request.originalPrice - discountAmount;

        return {
            discountAmount,
            discountedPrice,
        };
    }
}
// 使用折扣处理链计算折扣
const discountRequest = {
    originalPrice: 100,
};

const fixedDiscountHandler = new FixedDiscountHandler(50);
const percentageDiscountHandler = new PercentageDiscountHandler(0.2);

fixedDiscountHandler.next = percentageDiscountHandler;

const discountResponse = fixedDiscountHandler.handle(discountRequest);

console.log(`折扣金额:${discountResponse.discountAmount}`);
console.log(`折扣后价格:${discountResponse.discountedPrice}`);

输出:

折扣金额:20
折扣后价格:80

在上面的示例中,我们创建了一个折扣处理链,它包含一个固定折扣处理器和一个百分比折扣处理器。当我们调用handle()方法时,请求将沿着链式结构传递,直到找到可以处理请求的组件。在我们的例子中,固定折扣处理器可以处理请求,因此它将返回折扣金额和折扣后价格。

职责链模式是一种非常强大的设计模式,它可以用于解决各种各样的问题。在电商购物中,职责链模式可以帮助商家构建一个灵活的优惠系统,实现精准营销,提升销售额。