• 设计模式之策略模式


    1、场景:

    某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
    • 普通客户小批量报价
    • 普通客户大批量报价
    • 老客户小批量报价
    • 老客户大批量报价
    具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。

    2、案例

    可以先用条件语句处理:

    public class TestStrategy {
        public double getPrice(String type,double price){
            if (type.equals("普通客户小批量")) {
                System.out.println("不打折,原价");
                return price;
            } else if (type.equals("普通客户大批量")) {
                System.out.println("打九折");
                return price * 0.9;
            } else if (type.equals("老客户小批量")) {
                System.out.println("打八五折");
                return price * 0.85;
            } else if (type.equals("老客户大批量")) {
                System.out.println("打八折");
                return price * 0.8;
            }
            return price;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这种方式实现起来比较容易,符合一般开发人员的思路,但是假如类型特别多、算法比较复杂的时候,整个条件语句的代码就会变得很长,难以维护, 而且如果有新增类型就需要频繁的修改此处的代码,不符合开闭原则。

    3、策略模式

    策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。

    4、本质:

    分离算法,选择实现。

    5、开发中常见的场景:

    • Spring框架中,Resource接口,资源访问策略
    • javax.servlet.http.HttpServlet#service()

    6、代码实现

    /**
     * 策略接口
     * @author tqq
     * @date 2021-04-02-10:33
     */
    public interface Strategy {
        public double getPrice(double standardPrice);
    }
    
    /**
     * 新客户小批量的策略
     * @author tqq
     * @date 2021-04-02-10:34
     */
    public class NewCustomFewStrategy implements Strategy{
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("新客户小批量,不打折");
            return standardPrice;
        }
    }
    /**
     * 新客户大批量的策略
     * @author tqq
     * @date 2021-04-02-10:34
     */
    public class NewCustomManyStrategy implements Strategy{
        @Override
        public double getPrice(double standardPrice) {
            System.out.println("新客户大批量,打9折");
            return standardPrice*0.9;
        }
    }
    
    /**
     * 负责和具体的算法交互
     * 如此,具体的算法和直接的客户端调用分离了,使得算法可以独立与客户端独立的变化
     * 如果使用Spring的依赖注入功能,可以通过配置文件动态的注入不同的策略对象,动态的切换不同的算法
     * @author tqq
     * @date 2021-04-02-10:39
     */
    public class Context {
        private Strategy strategy;//当前采用的算法对象
    
        //通过构造器注入
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
        //通过set注入
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
        public void printPrice(double s){
            System.out.println("你的报价为:"+strategy.getPrice(s));
        }
    }
    
    /**
     * 测试类
     * @author tqq
     * @date 2021-04-02-10:44
     */
    public class Client{
        public static void main(String[] args) {
            Strategy s1 = new OldCustomFewStrategy();
            Context context = new Context(s1);
            context.printPrice(100);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    7、代码类图

    在这里插入图片描述

  • 相关阅读:
    ALTERA FPGA IPCORE核之FIFO详细教程
    【已解决】msvcp140.dll丢失怎样修复?msvcp140.dll重新安装的解决方法
    TrendMicro:Apex One Server 工具文件夹
    JMeter笔记16 | 性能参数配置及测试监听
    mysql数据库基础管理--数据库权限表
    Shiro获取登录人数据
    stack, queue 模拟与用法
    来自jackson的灵魂一击:@ControllerAdvice就能保证万无一失吗?
    第三站:函数(第三幕)递归训练
    C++的继承基础和虚继承原理
  • 原文地址:https://blog.csdn.net/weixin_42072357/article/details/132620185