文章目录
【设计模式】行为型模式:策略模式
在工作中,遇到这么一个需求, 同一个系统中,有多个门店的信息,也就是多租户的方式,都存在下单并支付的功能,且不同的门店之间的优惠都有差异,比如:
- 第一个门店优惠 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了