优雅替换if-else,代码更高端

记一次代码优化,通过策略模式+工厂+单例取代多if-else

先看个示例
public class SaleDemo {
    public void sale(String code) {
        if ("家电".equals(code)) {
            // 买家电送家电
        } else if ("蔬菜".equals(code)) {
            // 买蔬菜送蔬菜
        } else if ("水果".equals(code)) {
            // 买水果送水果
        } else if ("衣服".equals(code)) {
            // 买衣服送衣服
        } else {
            // 。。。大促销,买啥送啥
        }
    }
}

这还是只是一个空架子,里面在加点逻辑,看起来就比较低端,怎么办?上干货。

1. 策略模式
public interface SaleStrategy {
    public void doThing();
}
public class BuyDQ implements SaleStrategy{
    @Override
    public void doThing() {
    	// 买家电送家电
        System.out.println("买家电送家电");
    }
}
public class BuySC implements SaleStrategy{
    @Override
    public void doThing() {
    	// 买蔬菜送蔬菜
        System.out.println("买蔬菜送蔬菜");
    }
}
public class BuyYF implements SaleStrategy{
    @Override
    public void doThing() {
    	// 买衣服送衣服
        System.out.println("买衣服送衣服");
    }
}

对示例进行第一次优化,如下:

public class SaleDemo {

    public void sale(String code) {
    SaleStrategy strategy = null;
        if ("家电".equals(code)) {
            strategy = new BuyDQ();
        } else if ("蔬菜".equals(code)) {
            strategy = new BuySC();
        } else if ("衣服".equals(code)) {
            strategy = new BuyYF();
        } else {
            // 。。。大促销,买啥送啥
        }
        strategy.doThing();
    }
}

咋一看,没什么变法,只是将具体实现提出来,if-else还在。再来!!!第二次优化

2. 单例模式+工厂
public class StrategyFactory {

    static Map<String, SaleStrategy> map;

    static {
        map = new HashMap<>();
        map.put("DQ", new BuyDQ());
        map.put("SC", new BuySC());
        map.put("YF", new BuyYF());
    }

    private StrategyFactory() {

    }

    public static StrategyFactory getInstance() {
        StrategyFactory factory = new StrategyFactory();
        return factory;
    }

    public SaleStrategy getApi(String code) {
        return map.get(code);
    }
}
public class StrategyDemoService {
    public void strategyService(String code) {
        SaleStrategy api = StrategyFactory.getInstance().getApi(code);
        api.doThing();
    }
}

改造完成,实际调用处不见if-else,是不是感觉高端一点呢。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值