• 最简单的策略模式代替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));
    
        }
    }

    五、结果

  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/geekdc/p/11580219.html
Copyright © 2020-2023  润新知