一、需求
根據用戶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)); } }
五、結果