【设计模式】行为型模式:策略模式

文章通过一个实际场景展示了如何运用策略模式来处理不同门店的差异化优惠策略。创建了订单实体类、订单优惠接口以及针对不同门店的优惠策略实现类,最后通过策略上下文执行不同的优惠策略,实现了灵活的订单处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【设计模式】行为型模式:策略模式

在工作中,遇到这么一个需求, 同一个系统中,有多个门店的信息,也就是多租户的方式,都存在下单并支付的功能,且不同的门店之间的优惠都有差异,比如:

  • 第一个门店优惠 10 元
  • 第二个门店优惠 20 元

我这里只是举例说明,实际情况可能是,根据部门优惠,或者根据订单金额满减之类的,为了方便演示,所以我直接不同的策略优惠不同的金额,用于区分,下面直接上代码

订单实体类

import lombok.Data;

import java.math.BigDecimal;

/**
 * 订单
 *
 * @author Tellsea
 * @date 2023/1/16
 */
@Data
public class OrderInfo {

    /**
     * 名称
     */
    private String title;
    /**
     * 实付金额
     */
    private BigDecimal payMoney;
    /**
     * 优惠金额
     */
    private BigDecimal discountMoney;
}

订单优惠接口,用于策略的统一标准

/**
 * 订单优惠接口
 *
 * @author Tellsea
 * @date 2023/1/16
 */
public interface OrderInfoStrategy {

    /**
     * 具体优惠
     *
     * @param orderInfo
     * @return
     */
    OrderInfo discount(OrderInfo orderInfo);
}

门店一的具体优惠

import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;

/**
 * 门店一的优惠
 *
 * @author Tellsea
 * @date 2023/1/16
 */
public class OrderInfoOneStrategy implements OrderInfoStrategy {

    @Override
    public OrderInfo discount(OrderInfo orderInfo) {
        orderInfo.setDiscountMoney(new BigDecimal("10"));
        orderInfo.setPayMoney(NumberUtil.sub(orderInfo.getPayMoney(), orderInfo.getDiscountMoney()));
        return orderInfo;
    }
}

门店二的优惠

import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;

/**
 * 门店二的优惠
 *
 * @author Tellsea
 * @date 2023/1/16
 */
public class OrderInfoTwoStrategy implements OrderInfoStrategy {

    @Override
    public OrderInfo discount(OrderInfo orderInfo) {
        orderInfo.setDiscountMoney(new BigDecimal("20"));
        orderInfo.setPayMoney(NumberUtil.sub(orderInfo.getPayMoney(), orderInfo.getDiscountMoney()));
        return orderInfo;
    }
}

策略类编写

/**
 * 订单策略
 *
 * @author Tellsea
 * @date 2023/1/16
 */
public class OrderInfoContext {

    private OrderInfoStrategy orderInfoStrategy;

    public OrderInfoContext(OrderInfoStrategy orderInfoStrategy) {
        this.orderInfoStrategy = orderInfoStrategy;
    }

    public OrderInfo executeStrategy(OrderInfo orderInfo) {
        return orderInfoStrategy.discount(orderInfo);
    }
}

最后,直接测试不同的策略模式,产生的不同结果

import java.math.BigDecimal;

/**
 * 策略模式测试
 *
 * @author Tellsea
 * @date 2023/1/16
 */
public class OrderInfoTest {

    public static void main(String[] args) {
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setTitle("Apple iPhone 13 Pro Max");
        orderInfo.setPayMoney(new BigDecimal("10000"));

        OrderInfoContext orderInfoContext = new OrderInfoContext(new OrderInfoOneStrategy());
        orderInfoContext.executeStrategy(orderInfo);

        orderInfoContext = new OrderInfoContext(new OrderInfoTwoStrategy());
        orderInfoContext.executeStrategy(orderInfo);

        System.out.println(orderInfo);
    }
}

到此,策略模式在实际中的应用已经OK了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tellsea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值