zoukankan      html  css  js  c++  java
  • 策略模式

    一、定义:

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

    方法中有大量的if...else...

    类型:行为型

    二、适用场景

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

    一个系统需要动态地在几种算法(策略)中选择一种

    三、优点

    1、开闭原则

    2、避免使用多种条件转移语句if..else

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

    四、缺点

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

    2、产生很大策略类

    五、策略模式-相关设计模式

    1、策略模式和工厂模式(工厂方法、抽象工厂)

    工厂模式:创建型设计模式。接受指令,创建符合要求的对象

    策略模式:行为型设计模式。接受已经创建好的对象,从而实现不同的行为。

    2、策略模式和状态模式

    策略模式:客户端需要知道选择哪个策略

    状态模式:客户端不需要关系具体的状态,这些状态可以自动转换。

    六、Conding

    课程促销行为,促销策略:满减策略,发现促销策略

    1、PromotionStrategy 接口

    /**
     *  促销策略
     */
    public interface PromotionStrategy {
        void doPromotion();
    }
    

      

    2、FanXianPromotionStrategy 类

    /**
     * 反现策略
     */
    public class FanXianPromotionStrategy  implements  PromotionStrategy{
        @Override
        public void doPromotion() {
            System.out.println("反现促销,返回的金额放到余额中。");
        }
    }
    

      

    3、LiJianPromotionStrategy类

    /**
     * 立减策略
     */
    public class LiJianPromotionStrategy implements  PromotionStrategy{
        @Override
        public void doPromotion() {
            System.out.println("立减促销,课程的价格返回配置的价格");
        }
    }
    

      

    4、ManJianPromotionStrategy  类

    /**
     * 满减策略
     */
    public class ManJianPromotionStrategy  implements  PromotionStrategy{
        @Override
        public void doPromotion() {
            System.out.println("满减促销,满200元,减20元");
        }
    }
    

      

    5、PromotionActivity 类

    /**
     * 促销活动
     */
    public class PromotionActivity {
    
        private  PromotionStrategy promotionStrategy;
    
        public PromotionActivity(PromotionStrategy promotionStrategy) {
            this.promotionStrategy = promotionStrategy;
        }
    
        public void execute(){
            this.promotionStrategy.doPromotion();
        }
    }
    

     

    6、测试

     

    public class Test {
        public static void main(String[] args) {
            PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy()) ;
    
            PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy()) ;
            promotionActivity618.execute();
            promotionActivity1111.execute();
        }
    }
    

      

    7、UML图

    七、Coding演进

    上面的方法缺点:还是不能去除if...else...

    升级:

    1、PromotionStrategyFactory 类

    /**
     * 促销策略工厂
     */
    public class PromotionStrategyFactory {
        private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();
    
        static {
            PROMOTION_STRATEGY_MAP.put(PromationKey.LIJIAN, new LiJianPromotionStrategy());
            PROMOTION_STRATEGY_MAP.put(PromationKey.FANXIAN, new FanXianPromotionStrategy());
            PROMOTION_STRATEGY_MAP.put(PromationKey.MANJIAN, new ManJianPromotionStrategy());
        }
    
        private  static  final PromotionStrategy NONE_PROMATION = new EmptyPromotionStrategy();
    
        private PromotionStrategyFactory(){
    
        }
    
        public static PromotionStrategy getPromotionStrategy(String promotionKey){
            PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
            return  promotionStrategy == null ? NONE_PROMATION : promotionStrategy;
        }
    
        private  interface PromationKey{
            String LIJIAN = "LIJIAN";
            String FANXIAN = "FANXIAN";
            String MANJIAN = "MANJIAN";
        }
    }
    

      

    2、EmptyPromotionStrategy 类

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

      

    3、测试

        public static void main(String[] args) {
            String promotionKey = "LIJIAN";
            PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
            promotionActivity.execute();
    
    
        }
    

      这样就消除了If..Else

    八、在源码中的使用

    1、Comparator

     如BooleanComparator,BigDecimalComparator实现了比较器。就好比有多重策略。

    2、Spring 中的Resource(策略的抽象)

    实现类ClassPathResource(策略的实现)

    3、Spring中的初始化策略类

    实现类有:

  • 相关阅读:
    文件名中含有空格读取时产生的异常
    R 常用清洗函数汇总
    Fluid 0.4 新版本正式发布:支持数据预热,优化小文件场景
    阿里云 Serverless 再升级,从体验上拉开差距
    Dubbo-go 源码笔记(二)客户端调用过程
    高质量的缺陷分析:让自己少写 bug
    微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
    OpenYurt 深度解读:如何构建 Kubernetes 原生云边高效协同网络?
    在大规模 Kubernetes 集群上实现高 SLO 的方法
    双十一购物节,Nacos 1.4.0 + Go SDK 1.0.1发布
  • 原文地址:https://www.cnblogs.com/linlf03/p/10442893.html
Copyright © 2011-2022 走看看