策略模式

背景

之前电商项目中增加了优惠券,优惠券有很多种类,增加了大量的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直观,这样才能成为公司不可或缺的人才

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 行为型模式:类和对象如何交互,划分责任和算法,即对象之间通信。 概念 策略模式是对算法的包装,是把使用算法的责任和...
    雪飘千里阅读 2,761评论 0 1
  • 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模...
    javacoo阅读 2,540评论 0 1
  • 策略模式(Strategy Pattern)是指定义了算法家族、分别封装起来,让它们之间可以互 相替换,此模式让算...
    提玛欧斯阅读 3,440评论 0 0
  • 前言 前阵子面试的时候,有个面试官问我了解哪些设计模式吗?我说了策略模式。接着他问有哪些场景应用,我又回答他jdk...
    鄙人薛某阅读 2,726评论 0 0
  • 一、策略 策略,指的是可以实现目标的方案集合,在某些特定情况下,策略之间是可以相互替换的。 比如在外卖平台上的这些...
    Djbfifjd阅读 16,750评论 5 7