美文网首页
策略模式

策略模式

作者: 半日孤独 | 来源:发表于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