美文网首页
如何通过枚举类来减少代码中的if...else...语句

如何通过枚举类来减少代码中的if...else...语句

作者: 不怕天黑_0819 | 来源:发表于2020-10-16 16:07 被阅读0次

场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。

解决思路

1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。

public abstract class GeneralChannelRule {
 public abstract void process();
}

2、编写一个腾讯的规则类,定义具体对于腾讯渠道数据的处理逻辑

public class TencentChannelRule extends GeneralChannelRule
   @Override
    public void process() {
        // Tencent处理逻辑
    }
}

3、编写一个头条的规则类,定义具体对于头条数据的处理逻辑

public class TouTiaoChannelRule extends GeneralChannelRule
   @Override
    public void process() {
        // TouTiao处理逻辑
    }
}

4、建立一个简单的枚举类

public enum ChannelRuleEnum {
    /**
     * 头条
     */
    TOUTIAO("TOUTIAO"),
    /**
     * 腾讯
     */
    TENCENT("TENCENT"),
    ;
  ....
}

5、使用规则对数据进行处理。

public static void main(String[] args) {
        //这里我们模拟接收到的数据,其渠道为为TOUTIAO,来自头条的数据
        String sign = "TOUTIAO";
        GeneralChannelRule rule;
        //根据对应渠道获取对应的具体规则实现类
        if (ChannelRuleEnum.TENCENT.code.equals(sign)) {
            rule = new TencentChannelRule();
        } else if (ChannelRuleEnum.TOUTIAO.code.equals(sign)) {
            rule = new TouTiaoChannelRule();
        } else {
            //匹配不到
        }
        //执行
        rule.process();
    }

解析:如果通过上面的方式,则存在则两个缺点。

当我们需要新增新的渠道的时候,需要对main方法中的逻辑进行修改调整。这违背了设计模式中的开放封闭规则。开放封闭原则的核心的思想是软件实体是可扩展,而不可zhi修改的。

也就是说,对扩展是开放的,而对修改是封闭的

新增渠道后,修改代码会产生大量的if else,不太优雅。为了解决以上的两个问题,我们可以借助枚举类来巧妙优化。

新的思路

1、下面我们调整一下枚举类,增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法。

public enum ChannelRuleEnum {

    /**
     * 头条
     */
    TOUTIAO("TOUTIAO",new TouTiaoChannelRule()),
    /**
     * 腾讯
     */
    TENCENT("TENCENT",new TencentChannelRule()),
    ;

    public String name;

    public GeneralChannelRule channel;

    ChannelRuleEnum(String name, GeneralChannelRule channel) {
        this.name = name;
        this.channel = channel;
    }

  //匹配
    public static ChannelRuleEnum match(String name){
        ChannelRuleEnum[] values = ChannelRuleEnum.values();
        for (ChannelRuleEnum value : values) {
            if(value.name.equals(name)){
                return value;
            }
        }
        return null;
    }
    public String getName() {
        return name;
    }

    public GeneralChannelRule getChannel() {
        return channel;
    }
}

2、改写程序

public static void main(String[] args) {
        String sign = "TOUTIAO";
        ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);
        GeneralChannelRule rule = channelRule.channel;
        rule.process(sign);
    }

解析:通过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。通过改变:

可以减少if -else使得代码更加优雅 如果需要新增渠道,我们只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。

来源:减少代码中的if...else...

相关文章

  • 如何通过枚举类来减少代码中的if...else...语句

    场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不...

  • 设计模式 - 工厂模式(策略工厂)

    首先,按照if...else if语句来实现打折商品的例子,代码如下: 用策略+工厂模式优化:枚举类: 接口类 接...

  • js4

    1.条件语句:条件语句是通过判断指定表达式的值来决 定执行还是跳过某些语句 最基本的条件语句: if...else...

  • [swift 进阶]读书笔记-第五章:结构体和类 C5P1_2

    结构体和类 值类型:结构体、枚举引用类型:类 使用类,我们可以通过继承来共享代码。结构体、枚举无法继承。正好符合s...

  • 054|Object.defineProperty全解析

    枚举性 在前面的课程中,我们知道可以对象添加属性,并且可以使用for...in语句来枚举这些属性。如: 上述代码会...

  • 【Java】 java基础和面向对象(回顾)

    Java枚举 ava 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。 注意:...

  • JQuery节点操作

    通过 JQuery 节点操作的办法来实现交互,减少手动添加类名操作。优点是能够减少重复功能代码,缺点是如果模板类名...

  • 算法初级

    伪代码与流程图 机构化编程 一行一行的执行代码 有条件控制语句 if...else... 有循环控制语句while...

  • 枚举

    如何定义枚举类 什么枚举类:类里的对象是有限个,可以枚举出来 如何使用enum定义枚举类 枚举...

  • <转> 通过枚举 enum 来实现单例模式

    转自:通过枚举 enum 来实现单例模式 枚举 通过enum关键字来实现枚举,在枚举中需要注意的有: 枚举中的属性...

网友评论

      本文标题:如何通过枚举类来减少代码中的if...else...语句

      本文链接:https://www.haomeiwen.com/subject/pynzpktx.html