Java策略模式

定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户

类型:行为型

使用场景:

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

一个系统需要动态地在集中算法中选择一种

优点:

1.开闭原则

2.避免使用多重条件转义语句

3.提高算法的保密性和安全性

缺点:

客户端必须知道所有的策略类,并自行决定使用哪一个策略类

产生了很多策略类

 接口:

public interface PromotionsStrategy {
    void doPromotion();
}

  执行动作:

    private PromotionsStrategy promotionsStrategy;

    public PromotionActivity(PromotionsStrategy promotionsStrategy) {
        this.promotionsStrategy = promotionsStrategy;
    }
    public  void executePromotionsStrategy(){
        promotionsStrategy.doPromotion();
    }
}

 为空的情况:

public class EmptyPromotionStrategy implements PromotionsStrategy{
    @Override
    public void doPromotion() {
        System.out.println("无处销活动");
    }
}

  返现:

public class FanXianPromotionsStrategy implements PromotionsStrategy{
    @Override
    public void doPromotion() {
        System.out.println("返现促销,返回的金额存放到慕课网用户的余额中");
    }
}

  立减:

public class LiJianPromotionsStrategy implements PromotionsStrategy {
    @Override
    public void doPromotion() {
        System.out.println("立减促销,返回的金额存放到慕课网用户的余额中");
    }
}

  满减:

public class ManJianPromotionsStrategy  implements  PromotionsStrategy{
    @Override
    public void doPromotion() {
        System.out.println("满减促销,返回的金额存放到慕课网用户的余额中");
    }
}

  工厂:

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

public class PromotionsStrategyFactory {
    private static Map<String, PromotionsStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionsStrategy>();

    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LiJianPromotionsStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionsStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionsStrategy());
    }

    private static final PromotionsStrategy NON_PROMOTION = new EmptyPromotionStrategy();

    private PromotionsStrategyFactory() {

    }

    public static PromotionsStrategy getPromotionStrategy(String promotionsKey) {
        PromotionsStrategy promotionsStrategy = PROMOTION_STRATEGY_MAP.get(promotionsKey);
        return promotionsStrategy == null ? NON_PROMOTION : promotionsStrategy;
    }

    private interface PromotionKey {
        String LIJIAN = "LIJIAN";
        String FANXIAN = "FANXIAN";
        String MANJIAN = "MANJIAN";
    }
}

  测试:

public class main {
    public static void main(String[] args) {
//        PromotionActivity promotionActivity618=new PromotionActivity(new LiJianPromotionsStrategy());
//        PromotionActivity promotionActivity1111=new PromotionActivity(new FanXianPromotionsStrategy());
//
//        promotionActivity618.executePromotionsStrategy();
//        promotionActivity1111.executePromotionsStrategy();

//        PromotionActivity promotionActivity=null;
//        String promotionKey="LIJIAN";
//        if(StringUtils.equals(promotionKey,"LIJIAN")){
//            promotionActivity=new PromotionActivity(new LiJianPromotionsStrategy());
//        }else if(StringUtils.equals(promotionKey,"FANXIAN")){
//            promotionActivity=new PromotionActivity(new FanXianPromotionsStrategy());
//        }
//        promotionActivity.executePromotionsStrategy();

        String promotionKey="LIJIAN";
        PromotionActivity promotionActivity=new PromotionActivity(PromotionsStrategyFactory.getPromotionStrategy(promotionKey));
        promotionActivity.executePromotionsStrategy();

    }
}

  

 

posted @ 2019-04-11 13:07  石shi  阅读(668)  评论(0编辑  收藏  举报