优雅的处理if-else 工厂模式+策略模式

摘要

对于简单的if-else语句可以通过卫语句处理。

public void doSomeThing(Object obj){
       if(obj!=null){
           System.out.println("继续处理");
       }else{
           System.out.println("不处理");
       }
   }

   //卫语句
   public void doSomeThing2(Object obj){
       if(obj==null){
           System.out.println("不处理");
           return;
       }
       System.out.println("继续处理");
   }

但是实际开发过程中我们会遇到复杂的多的条件判断,此时这种方式就无法优化了。

需求

电商系统中,可以根据用户VIP等级,享受打折优惠。

  • 普通会员 不打折
  • 白银会员 9折
  • 黄金会员 8折
  • 白金会员 7折
    此时直接通过if-else实现代码如下
public double getMoney(long money,int type ){
        double result=money;
        if(type== VipEnum.PLATINUM.getValue()){
            System.out.println("白金会员7折");
            result=money*0.7;
        }else if(type==VipEnum.GOLD.getValue()){
            System.out.println("黄金会员8折");
            result=money*0.8;
        }else if(type==VipEnum.SILVER.getValue()){
            System.out.println("白银会员9折");
            result=money*0.9;
        }else if(type==VipEnum.NORMAL.getValue()){
            System.out.println("普通会员不打折");
        }
        return result;
    }

策略模式

通过策略模式优化。

  1. 定义vip计价接口类
public interface VipStrategy {
    double getMoney(long money);
}
  1. 针对每一类vip实现上面接口

普通会员

public class NormalStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("普通会员不打折");
        return money;
    }
}

白银会员

public class SilverStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("白银会员9折");
        return money*0.9;
    }
}

黄金会员

public class GoldStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("黄金会员8折");
        return money*0.8;
    }
}

白金会员

public class PlatinumStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("白金会员7折");
        return money*0.7;
    }
}
  1. 根据type分别实例vipStrategy从而计算价格
public double getMoney(long money,int type ){
        VipStrategy vipStrategy;
        if(type== VipEnum.PLATINUM.getValue()){
            vipStrategy=new PlatinumStrategy();
        }else if(type==VipEnum.GOLD.getValue()){
            vipStrategy=new GoldStrategy();
        }else if(type==VipEnum.SILVER.getValue()){
            vipStrategy=new SilverStrategy();
        }else{
            vipStrategy=new NormalStrategy();
        }
        return vipStrategy.getMoney(money);
    }

通过策略模式还是会存在if-else,只是进行了一定程度的解耦。增加了可读性,更方便了扩展。

工厂+策略模式

  1. 定义vip策略接口类
public interface VipStrategy {
    double getMoney(long money);
    int getType();
}
  1. 针对每一类vip实现上面接口

普通会员

public class NormalStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("普通会员不打折");
        return money;
    }

    @Override
    public int getType() {
        return VipEnum.NORMAL.getValue();
    }
}

白银会员

public class SilverStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("白银会员9折");
        return money*0.9;
    }

    @Override
    public int getType() {
        return VipEnum.SILVER.getValue();
    }
}

黄金会员

public class GoldStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("黄金会员8折");
        return money*0.8;
    }

    @Override
    public int getType() {
        return VipEnum.GOLD.getValue();
    }
}

白金会员

public class PlatinumStrategy implements VipStrategy {
    @Override
    public double getMoney(long money) {
        System.out.println("白金会员7折");
        return money*0.7;
    }

    @Override
    public int getType() {
        return VipEnum.PLATINUM.getValue();
    }
}
  1. 初始化策略工厂
public class VipStrategyFactory {
    private Map<Integer, VipStrategy> map;
    public VipStrategyFactory() {
        List<VipStrategy> strategies = new ArrayList<>();
        strategies.add(new NormalStrategy());
        strategies.add(new SilverStrategy());
        strategies.add(new GoldStrategy());
        strategies.add(new PlatinumStrategy());
        map = strategies.stream().collect(Collectors.toMap(VipStrategy::getType, strategy -> strategy));
    }
    public static class Holder {
        public static VipStrategyFactory instance = new VipStrategyFactory();
    }

    public static VipStrategyFactory getInstance() {
        return Holder.instance;
    }

    public VipStrategy get(Integer type) {
        return map.get(type);
    }
}
  1. 根据type分别实例vipStrategy从而计算价格
public static double getMoney(long money, int type) {
    VipStrategy strategy = VipStrategyFactory.getInstance().get(type);
    if (strategy == null){
        throw new IllegalArgumentException("对应vip策略不存在,[type={"+type+"}]");
    }
    return strategy.getMoney(money);
}
发布了22 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u014395955/article/details/103804479