if的多重嵌套
直接举栗子:有一个电商平台,当用户消费满1000元,根据vip等级可享受优惠
- 普通会员 不打折
- 白银会员 优惠50元
- 黄金会员 打8折
- 白金会员 优惠50元,再打七折
Version 1.0
会员类型枚举
1 | public enum UserType { |
1 | private static double getResult(long money, int type){ |
可以看到这里的if语句可能不是那么繁琐,但是当业务十分复杂或者当策略会经常变动的时候,需要经常修改源代码,这就严重违反了开闭原则,但是我可不可减少if的出现甚至不出现呢?
下面我们结合以下两种解决方案来一步一步尝试解决问题
- 卫语句
- 策略模式
Version 1.1
卫语句,就是将不符合的情况直接返回
1 | public static double getResult(long money,int type){ |
Version 2.0
策略模式就是将各个会员的优惠方式提出一个接口,分别实现
策略接口
1 | public interface Strategy { |
普通会员
1 | public class OrdinaryStrategy implements Strategy{ |
黄金会员
1 | public class GoldStrategy implements Strategy{ |
白金会员
1 | public class PlatinumStrategy implements Strategy{ |
白银会员
1 | public class SilverStrategy implements Strategy{ |
1 | public static double getResult(long money,int type){ |
Version 2.1
1 | public class StrategyFactory { |
1 | public static double getResult(int userType, long money){ |
这里的工厂还可以通过这种方式来实现
Version 2.2
策略接口
1 | public interface Strategy { |
黄金会员
1 | public class GoldStrategy implements Strategy { |
普通会员
1 | public class OrdinaryStrategy implements Strategy { |
白金会员
1 | public class PlatinumStrategy implements Strategy { |
白银会员
1 | public class SilverStrategy implements Strategy { |
策略工厂
1 | public class StrategyFactory { |
1 | public static double getResult(int userType, long money){ |