策略模式
在23种设计模式当中,策略模式也是一个十分常用的模式。也许在写业务逻辑的过程中,我们可能需要根据不同的条件写一大堆的if
和else
条件语句,这直接造成的影响是可扩展性很差并且可读性也很差。而借助策略模式,我们可以写出扩展性很好的优雅代码。
实际命题
假如我们有这样一个需求,在设计商户打折系统中,要针对不同的情况对商户进行折扣计算,并且如果有多种折扣重叠,取最大的折扣(有时候也可以累加),具体的折扣计算规则如下:
- 新注册用户 ,一律8折;
- 有优惠券的,根据优惠券的种类,每次可以打9,8,7折;
- 早上9点~10点可以享受9折优惠;
- 月达到10次用户可以享受6折优惠一次;
根据上述的打折条件,我们该怎么设计一个可扩展可维护的系统呢?
一般解决方法
一般我们需要遵循面向接口编程和开放封闭原则,在Java设计中,我们首先要定义功能的接口以及实现类,我们首先去定义所需要的类。然后使用if
和else
依次判断所有的情况。
消费记录类
@Data
public class ConsumeRecode {
/**
* 消费时间
*/
private LocalDateTime time;
/**
* 消费用户
*/
private Customer customer;
}
消费者类
@Data
public class Customer {
/**
* 是否为新的用户
*/
private boolean isNewCustomer;
/**
* 当月消费次数
*/
private int count;
}
打折服务接口
public interface DiscountService {
int getDiscountPercent(ConsumeRecode consumeRecode);
}
打折服务实现类
public class DiscountServiceImpl implements DiscountService {
@Override
public int getDiscountPercent(ConsumeRecode consumeRecode) {
return 0;
}
}
然后在getDiscountPercent
当中实现判断逻辑
public int getDiscountPercent(ConsumeRecode consumeRecode) {
int discount = 0;
LocalDateTime time = consumeRecode.getTime();
if (time.getHour() >= 9 && time.getHour() <= 10) {
discount = 90;