背景
之前电商项目中增加了优惠券,优惠券有很多种类,增加了大量的if-else代码,所以使用策略模式进行改进。
适用场景
1.多种选择方式(及多个场景),每一种方式则是一个策略
2.使用场景:出行方式,优惠券则扣
3.策略对象需要实现某个共同的接口
4.解决代码耦合度,增强代码的扩展性
实现共同接口
/**
* @author zzp
* @ClassName Strategy
* @Description 策略模式接口,优惠券策略
* @createTime 2021年01月07日
*/
public interface Strategy {
BigDecimal couponStrategy();
}
编写所需要的实现类
/**
* @author zzp
* @ClassName LimitTimeStrategy
* @Description 限时优惠券处理
* @createTime 2021年01月07日
*/
public class LimitTimeStrategy implements Strategy {
@Override
public BigDecimal couponStrategy() {
//进行限时优惠券处理
String price = "123";
return new BigDecimal(price);
}
}
/**
* @author zzp
* @ClassName LimitCountStrategy
* @Description 限量优惠券
* @createTime 2021年01月07日
*/
public class LimitCountStrategy implements Strategy {
@Override
public BigDecimal couponStrategy() {
//限量优惠券处理
String price = "123";
return new BigDecimal(price);
}
}
/**
* @author zzp
* @ClassName fullSubtractStrategy
* @Description 满减优惠券
* @createTime 2021年01月07日
*/
public class fullSubtractStrategy implements Strategy {
@Override
public BigDecimal couponStrategy() {
//满减优惠券处理
String price = "123";
return new BigDecimal(price);
}
}
调用
public class StrategyMain {
Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public BigDecimal travelStyle(){
return strategy.couponStrategy();
}
public static void main(String[] args) {
StrategyMain traveler = new StrategyMain();
//执行限时则扣券
traveler.setStrategy(new LimitTimeStrategy());
System.out.println(traveler.travelStyle());
//执行限量折扣券
traveler.setStrategy(new LimitCountStrategy());
System.out.println(traveler.travelStyle());
//执行满减折扣券
traveler.setStrategy(new fullSubtractStrategy());
System.out.println(traveler.travelStyle());
}
}
优缺点
优点
- 避免了大量的if-else代码
- 对以后增加的优惠券,扩展功能较好
- 代码的优雅度提高了
缺点
- 必须知道用户使用的是哪一种优惠券
- 增加的策略实现类变多,要考虑其他同事能不能维护
扩展
- 与模板模式实现起来都是有相同的地方的。
- 模板模式:为了把相同部分且不会太多变动的功能给抽象出来做一个模板,在抽象类中把相同的功能给实现,并且不需要子类去重写相同的部分,只让子类重写自己扩展的功能。
网友评论