首页 > 其他分享 >if else与策略模式

if else与策略模式

时间:2023-03-08 19:37:05浏览次数:27  
标签:策略 VIPStrategy void arg 模式 else vipStrategy public

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

更多:使用策略模式

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

标签:策略,VIPStrategy,void,arg,模式,else,vipStrategy,public
From: https://www.cnblogs.com/zko0/p/17195834.html

相关文章

  • Dubbo 在 Proxyless Mesh 模式下的探索与改进
    01背景随着Docker和Kubernetes的出现,一个庞大的单体应用可以被拆分成多个独立部署的微服务,并被打包运行于对应的容器中。不同应用之间相互通信,以共同完成某一功能模......
  • python单例模式处理多线程问题
    #单例模式处理多线程的问题importthreadingimporttimeclassSingle:instance=Nonedef__init__(self,name):self.name=namedef__new__(cls,......
  • 关于Android事件分发的设计模式理解与思考
    关于Android事件分发的设计模式理解与思考在现在Android智能机上,触碰几乎成为了唯一的交互方式。那么触碰消息在Android系统当中怎么进行分发的呢?在事件分发处理上,Androi......
  • zabbix被动模式和主动模式的区别
    主动模式、被动模式都是以zabbixagent的角度来说的。以下从几个方面来深入解释2个模式的区别。主动模式active:主动模式下,zabbixagnet定时向zabbixserver发送自身监控......
  • 10、Redis集群模式
    1.Redis主从模式和cluster分片集群区别redis主从模式,是所有Redis数据一致,但是key过多了会影响性能cluster分片集群,可以将数据分散到多个Redis节点,数据分片存储,能够提高re......
  • C++ 性能反向优化——用哈希表消除if else导致的性能降低。
    从代码整洁的角度考虑,对于不同的值将调用相同参数的不同函数,我们通常可以通过建立从值到对应函数指针的哈希表,从而将ifelse消除。但实际可能使性能更低,以下是测试例子。......
  • 前端设计模式——观察者模式
    前端中的观察者模式(ObserverPattern),定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都能够得到通知并自动更新。在前端开发中,观察......
  • pod探针和重启策略
    示例:livenessProbe和HTTPGetAction:[root@localhost7C~]#catnginx-http.ymlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentlabels:......
  • 设计模式之结构型模型
    设计模式之结构型模型桥接模式尽可能不要使用类的继承,而尽可能使用合成/聚合描述:继承方法子类与父类的高依赖性限制了复用和程序的灵活性。选择不同的接口实现选择不同......
  • 设计模式5——自定义Spring框架
    1、Spring核心功能结构Spring大约有20个模块,由1300多个不同的文件构成。这些模块可以分为:核心容器、AOP和设备支持、数据访问与集成、Web组件、通信报文和集成测试等。下......