1.概念:

 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

 

2.注意:

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

 

3.使用场景: 

  场景:商城活动中有几种,满减,打折,送积分....

  4.实现   1.定义商品价格类
public interface GoodsActivity {

    /**
     * 获取应该支付的金额
     * @param amount 商品的单价
     * @return
     */
    BigDecimal getPayPrice(BigDecimal amount);

}

 

2.实现接口类

/**
 * 商品折扣活动
 *
 * @author chen
 * @create 2019-04-01 14:44
 **/
public class DiscountActivity implements GoodsActivity {

    //折扣
    private double discount;

    public DiscountActivity(double discount){
        this.discount = discount;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return new BigDecimal(discount).multiply(amount).divide(new BigDecimal(10));
    }
}

 

/**
 * 满减活动
 *
 * @author chen
 * @create 2019-04-01 14:48
 **/
public class FullReduceActivity implements GoodsActivity {

    //满多少
    private BigDecimal fullAmount;

    //减多少
    private BigDecimal reductionAmount;

    public FullReduceActivity(BigDecimal fullAmount,BigDecimal reductionAmount){
        this.fullAmount=fullAmount;
        this.reductionAmount=reductionAmount;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return amount.compareTo(fullAmount)>=0?amount.subtract(reductionAmount):amount;
    }
}
/**
 * 积分抵扣
 *
 * @author chen
 * @create 2019-04-01 14:58
 **/
public class IntegralActivity implements GoodsActivity {

    //抵扣的积分  10积分=1元
    private int integral;

    public IntegralActivity(int integral){
        this.integral = integral;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return amount.subtract(new BigDecimal(integral/10));
    }
}

 

3.创建Context

public class GoodsActivityContext {

    private GoodsActivity goodsActivity;

    public GoodsActivityContext(GoodsActivity goodsActivity){
        this.goodsActivity=goodsActivity;
    }

    /**
     * 获取商品价格
     * @param amount
     * @return
     */
    public BigDecimal getPrice(BigDecimal amount){
        return goodsActivity.getPayPrice(amount);
    }
}

 

5.定义引用入口

public class StrategyMain {

    /**
     *
     * 在商城系统中,经常有不同的活动,每种活动商品的价格计算可能都不一样
     * 比如:会员折扣,满减,积分抵扣.....
     *
     * @param args
     */
    public static void main(String[] args) {

        //商品价格
        BigDecimal amount = new BigDecimal(500);

        //满300-100
        GoodsActivity fullReduceActivity = new FullReduceActivity(new BigDecimal(300),new BigDecimal(100) );
        GoodsActivityContext goodsActivityContext = new GoodsActivityContext(fullReduceActivity);
        System.out.println("满减活动:"+goodsActivityContext.getPrice(amount));

        //折扣活动
        GoodsActivity discountActivity = new DiscountActivity(9);
        goodsActivityContext = new GoodsActivityContext(discountActivity);
        System.out.println("折扣活动:"+goodsActivityContext.getPrice(amount));

        //积分抵扣活动
        GoodsActivity integralActivity = new IntegralActivity(100);
        goodsActivityContext = new GoodsActivityContext(integralActivity);
        System.out.println("积分抵扣活动:"+goodsActivityContext.getPrice(amount));

    }

 

 

源码:

https://github.com/littleStone-chan/design-patternsIn-mall/tree/master/strategy

 

 

在工作中,不能灵活的时候设计模式。希望通过这次的学习,可以加深对设计模式对理解。

接下来会继续整理出自己在工作对时候可以使用对设计模式,不对望指点。如果文章对您有帮助,github给个start吧。

   

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄