if else与策略模式

1、前言

学习策略模式,对于大量的if else逻辑可以进行替换,使代码变得更加优雅简洁。

2、编写

①传统if else

使用if elsearg进行判断,对于不同的判断进行不同的逻辑操作;

public class Simple {
    void simple(String arg){
        if ("1".equals(arg)){
            //操作1
        }else if ("2".equals(arg)){
            //操作2
        }
    }
}

②策略模式(未完成版)

假设传入level为vip等级,对于不同等级进行不同会员等级的操作

一.策略抽象接口

定义一个策略接口,不同VIP等级操作类实现该接口

public interface VIPStrategy {
    public void handle();
}

二.策略实现类

一级VIP实现类:

public class VIP1StrategyImpl implements VIPStrategy{
    @Override
    public void handle() {
        System.out.println("会员等级1");
    }
}

二级VIP实现类:

public class VIP2StrategyImpl implements VIPStrategy{
    @Override
    public void handle() {
        System.out.println("会员等级2");
    }
}

三.策略工厂

通过level参数返回不同的策略实现类,进行操作

public class VIPStrategyFactory {
    
    public static final Map<String,VIPStrategy> map=new HashMap<>();

    static {
        map.put("vip1",new VIP1StrategyImpl());
        map.put("vip2",new VIP2StrategyImpl());
    }
    
    public static VIPStrategy getVipStrategy(String level) {
        return map.get(level);
    }

}

四.对比if else

public class NotGood {
    void notGood(String arg){
        VIPStrategy vipStrategy = VIPStrategyFactory.getVipStrategy(arg);
        vipStrategy.handle();
    }
}

③策略模式(完成版)

上面我们使用具体的VIPStrategy实现类进行了处理,如果我们对VIP需要添加通用方法,可以使用上下文(装饰器模式)封装他们的通用处理:在execute执行方法中,添加通用操作:

public class VIPContext {
    
    private VIPStrategy vipStrategy;

    public VIPContext(VIPStrategy vipStrategy) {
        this.vipStrategy = vipStrategy;
    }

    public void executeStrategy(){
        System.out.println("VIP通用处理");
        vipStrategy.handle();
    }

}

编写完成,简单测试一下:

public class Good {
    void good(String arg){
        VIPStrategy vip1 = VIPStrategyFactory.getVipStrategy("vip1");
        VIPContext vipContext = new VIPContext(vip1);
        vipContext.executeStrategy();
    }

    public static void main(String[] args) {
        Good good = new Good();
        good.good("vip1");
    }
}

image-20230308191938718

3、总结

使用策略模式代替if else确实能让代码的逻辑更加清晰,但是仅限于大量的if else,使用策略模式可以观察到,代码量会急剧膨胀

我的建议:

1-3个分支:if else

3-5个分支:switch

更多:使用策略模式

不过还是看个人的喜好,按你的选择即可

posted @ 2023-03-08 19:23  yikolemon  阅读(202)  评论(0)    收藏  举报