zoukankan      html  css  js  c++  java
  • 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();
    
        }
    }
    

      

     

  • 相关阅读:

    JVM基础
    rpm、yum、解压缩安装
    Vim使用及账号用户管理
    linux常用操作
    属主权限和属组权限
    解决Hystrix Dashboard 一直是Loading ...的情况
    扫描不到了@FeignClient注解的调用接口
    springcloud与springboot版本问题
    【力扣】6和9组成的最大数字 题解
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10688986.html
Copyright © 2011-2022 走看看