一、需求
根据用户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)); } }