设计模式之策略模式

1,目标

通过学习策略模式来消除代码中的大量的if...else...和switch语句

深刻理解策略模式的应用场景,提高算法的保密性和安全性。

2,定位

希望通过对策略模式的学习,来消除程序中的大量的冗余代码和多重转移语句

3,策略模式的定义

策略模式(Strategy pattern)是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。可以避免多重分支的if...else...和switch语句。

4,策略模式的适用场景

1,假如系统中有很多类,而他们的区别仅仅在于他们的行为不同。

2,一个系统需要动态地在几种算法中选择一种。

5,策略模式代码实现方法

我们按照培训机构卖课做为例子,首先创建一个培训课程的促销接口PromotionStrategy.java类

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public interface PromotionStrategy {
    void doPromotion();
}

再分别创建各种促销实现类,CashbackStrategy.java促销返现类

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class CashbackStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("返现促销,返现后的价格转到支付宝");
    }
}

培训机构发放优惠卷类CouponStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class CouponStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("领优惠券,课程后的价格");
    }
}

正常的无促销的类EmptyStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class EmptyStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("无促销活动");
    }
}

团购的类GroupbuyStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class GroupbuyStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("组团,满20人成团,全团享受团购价");
    }
}

再创建一个活动发布类PromotionAvtivity.java,通过发布的活动中的构造方法得到不同的优惠活动,通过execute方法执行具体的活动优惠力度。

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivity {
    PromotionStrategy promotionStrategy;

    public PromotionAvtivity(PromotionStrategy promotionStrategy){
        this.promotionStrategy = promotionStrategy;
    }

    public void execute(){
        this.promotionStrategy.doPromotion();
    }
}

最后再做一个测试类PromotionAvtivityTest.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {
    public static void main(String[] args) {
        PromotionAvtivity avtivity618 = new PromotionAvtivity(new CouponStrategy());
        PromotionAvtivity avtivityGroup = new PromotionAvtivity(new GroupbuyStrategy());
        avtivity618.execute();
        avtivityGroup.execute();
    }
}

我们看一下测试的结果。

领优惠券,课程后的价格
组团,满20人成团,全团享受团购价

Process finished with exit code 0

按照正常我们代码中使用写的话,应该使用下面的方式进行调用。 

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {   
 public static void main(String[] args) {
        PromotionAvtivity promotionAvtivity = null;
        String promotionKey = "COUPON";
        if(promotionKey.equals("COUPON")){
            promotionAvtivity = new PromotionAvtivity(new CouponStrategy());
        }else if(promotionKey.equals("CASHBACK")){
            promotionAvtivity = new PromotionAvtivity(new CashbackStrategy());
        }//.....
        promotionAvtivity.execute();
    }
}

 测试结果如下:

组团,满20人成团,全团享受团购价

Process finished with exit code 0

上面的代码还是有冗余,我们结合之前的工厂模式进行改造一下。

新建一个PromotionStrategyFactory.java类

package com.packer.partten.strategy.promotion;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionStrategyFactory {
    private static Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());
    }
    private static final PromotionStrategy  NON_PROMOTION = new EmptyStrategy();
    private PromotionStrategyFactory(){}
    public static PromotionStrategy getPromotionStrategy(String promotionKey){
        PromotionStrategy promotionStrategy =  PROMOTION_STRATEGY_MAP.get(promotionKey);
        return promotionStrategy == null?NON_PROMOTION:promotionStrategy;
    }

    private interface PromotionKey{
        String COUPON = "COUPON";
        String CASHBACK = "CASHBACK";
        String GROUPBUY = "GROUPBUY";
        String EMPTY = "EMPTY";
    }
}

测试方法如下:

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {

    public static void main(String[] args) {
        String promotionKey = "GROUPBUY";
        PromotionAvtivity promotionAvtivity = new PromotionAvtivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionAvtivity.execute();
    }
}

测试结果如下:

组团,满20人成团,全团享受团购价

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值