美文网首页
策略模式

策略模式

作者: 半日孤独 | 来源:发表于2021-01-08 10:25 被阅读0次

背景

之前电商项目中增加了优惠券,优惠券有很多种类,增加了大量的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代码
  • 对以后增加的优惠券,扩展功能较好
  • 代码的优雅度提高了
缺点
  • 必须知道用户使用的是哪一种优惠券
  • 增加的策略实现类变多,要考虑其他同事能不能维护

扩展

  • 与模板模式实现起来都是有相同的地方的。
  • 模板模式:为了把相同部分且不会太多变动的功能给抽象出来做一个模板,在抽象类中把相同的功能给实现,并且不需要子类去重写相同的部分,只让子类重写自己扩展的功能。

内心OS:学艺不精的我就要用if-else直观,这样才能成为公司不可或缺的人才

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/ujmxaktx.html