zoukankan      html  css  js  c++  java
  • 最简单的策略模式代替if-else实战

    一、需求

      根据用户vip等级来返回不同的价格,vip等级是不固定的,随时可能要增加,价格也不是固定的。

    二、常规的写法

    /**
     * 如果有新增类型,就需要频繁的修改此处的代码!
     * 不符合开闭原则!
     * @author DUCHONG
     *
     */
    public class CommonGetPrice {
    
        public static final String VIP1="v1";
        public static final String VIP2="v2";
        public static final String VIP3="v3";
        public static final String VIP4="v4";
    
        /**
         * 获取vip的价格
         * @param type vip类型
         * @param price 原价格
         * @return
         */
        public static double getVipPrice(String type, double price) {
    
            if (type.equals(VIP1)) {
                System.out.println("不使用策略模式---不打折,原价");
                return price;
            }
            else if (type.equals(VIP2)) {
                System.out.println("不使用策略模式---打九折");
                return price * 0.9;
            }
            else if (type.equals(VIP3)) {
                System.out.println("不使用策略模式---打八五折");
                return price * 0.85;
            }
            else if (type.equals(VIP4)) {
                System.out.println("不使用策略模式---打八折");
                return price * 0.8;
            }
            return price;
        }
    
    }

    三、使用策略模式

    3.1、定义策略接口

    /**
     * 策略接口
     * @author DUCHONG
     */
    public interface Strategy {
    
         double getVipPrice(double originPrice);
    }

    3.2、定义上下文

      上下文持有策略接口的引用,将算法与调用者隔离。

    /**
     * 负责和具体的策略类交互
     * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
     * 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法.
     * @author DUCHONG
     *
     */
    public class VipContext {
    
        /**
         * 当前采用的算法对象
         */
        private Strategy strategy;
    
        public VipContext() {
    
        }
        /**
         * 可以通过构造器来注入
         */
        public VipContext(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
        /**
         * 可以通过set方法来注入
         */
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public double getVipPrice(double originPrice){
            return strategy.getVipPrice(originPrice);
        }
    
    
    }

    3.3、不同算法实现类

    /**
     * @author DUCHONG
     * @since 2019-09-24 18:28
     **/
    public class VipOneStrategy implements Strategy {
    
        /**
         * vip1 不打折
         * @param originPrice
         * @return
         */
        @Override
        public double getVipPrice(double originPrice) {
    
            System.out.println("使用策略模式---不打折,原价");
            return originPrice;
        }
    }
    
    /**
     * @author DUCHONG
     * @since 2019-09-24 18:28
     **/
    public class VipTwoStrategy implements Strategy{
    
        @Override
        public double getVipPrice(double originPrice) {
            System.out.println("使用策略模式---打九折");
            return originPrice * 0.9;
        }
    }
    
    /**
     * @author DUCHONG
     * @since 2019-09-24 18:28
     **/
    public class VipThreeStrategy implements Strategy{
    
        @Override
        public double getVipPrice(double originPrice) {
            System.out.println("使用策略模式---打八五折");
            return originPrice * 0.85;
        }
    }
    
    /**
     * @author DUCHONG
     * @since 2019-09-24 18:28
     **/
    public class VipFourStrategy implements Strategy{
    
        @Override
        public double getVipPrice(double originPrice) {
            System.out.println("使用策略模式---打八折");
            return originPrice * 0.8;
        }
    }

    四、Client

    public class Client {
    
    
        public static void main(String[] args) {
    
            double originPrice=1000D;
    
            //使用策略模式之前
            System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP1,originPrice));
            System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP2,originPrice));
            System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP3,originPrice));
            System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP4,originPrice));
    
    
            //使用策略模式之后
            VipContext vipContext=new VipContext();
    
            Strategy v1=new VipOneStrategy();
            vipContext.setStrategy(v1);
            System.out.println(vipContext.getVipPrice(originPrice));
    
            Strategy v2=new VipTwoStrategy();
            vipContext.setStrategy(v2);
            System.out.println(vipContext.getVipPrice(originPrice));
    
            Strategy v3=new VipThreeStrategy();
            vipContext.setStrategy(v3);
            System.out.println(vipContext.getVipPrice(originPrice));
    
            Strategy v4=new VipFourStrategy();
            vipContext.setStrategy(v4);
            System.out.println(vipContext.getVipPrice(originPrice));
    
        }
    }

    五、结果

  • 相关阅读:
    [转]用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    xp_cmdshell开启与关闭
    [转]触发器
    上午绿茶下午菊花茶晚上枸杞
    SQL中CONVERT转化日期函数的使用方法
    如何使用url实现数据交互
    struts2之form标签theme属性详解
    [保险核心] 保险公司集中收付费系统
    数据库分页大全
    如何使用spring中hibernate返回获取list集合
  • 原文地址:https://www.cnblogs.com/geekdc/p/11580219.html
Copyright © 2011-2022 走看看