zoukankan      html  css  js  c++  java
  • 巧用枚举来干掉if-else,代码更优雅!

     代码中大量的if else 无疑会让代码的可读性变差,版本迭代时发现代码可读性太差,写个demo 记录一下。

    一、版本一(简单版)

     1、创建执行逻辑枚举类

    package com.example.dl.demo3;
    
    /**
     * @author D-L
     * @program: dl
     * @description: 创建执行逻辑枚举类
     * @date 2021-01-15 14:02:43
     */
    public enum EnumOperator {
        APP {
            @Override
            public void apply(String name) {
                System.out.println("移动客户端处理逻辑");
            }
        },
    
        PC {
            @Override
            public void apply(String name) {
                System.out.println("pc端处理逻辑");
            }
        };
    
        public abstract void apply(String name);
    }

    2、封装处理逻辑

    package com.example.dl.demo3;
    
    /**
     * @author D-L
     * @program: dl
     * @description: 封装处理逻辑
     * @date 2021-01-15 14:01:47
     */
    
    public class GeneralCalculator {
        public void calculate(String name ,EnumOperator operator) {
            operator.apply(name);
        }
    }

    3、调用

     public static void main(String[] args) {
            String name = "APP";
            GeneralCalculator calculator = new GeneralCalculator();
            EnumOperator operator = EnumOperator.valueOf(name);
            calculator.calculate(name ,operator);
        }

    二、版本二(进阶版)

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

    package com.example.dl.demo2;
    
    /**
     * @author D-L
     * @program: dl
     * @description: 首先构建一个 GeneralChannelRule 基础规则抽象类
     * @date 2021-01-15 11:23:56
     */
    
    public abstract class GeneralChannelRule {
        public abstract void apply(String sign);
    }

    2、实现具体的业务规则

    package com.example.dl.demo2;
    
    /**
     * @author D-L
     * @program: dl
     * @description: App移动客户端 处理逻辑
     * @date 2021-01-15 11:24:49
     */
    
    public class AppChannelRule extends GeneralChannelRule {
        @Override
        public void apply(String sign) {
            System.out.println("App移动客户端 处理逻辑");
        }
    }
    package com.example.dl.demo2;
    
    /**
     * @author D-L
     * @program: dl
     * @description: pc端 处理逻辑
     * @date 2021-01-15 11:25:28
     */
    
    public class PcChannelRule extends GeneralChannelRule {
        @Override
        public void apply(String sign) {
            System.out.println("pc端 处理逻辑");
        }
    }

    3、枚举类,增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法

    package com.example.dl.demo2;
    
    /**
     * @author D-L
     * @program: dl
     * @description: 创建枚举类
     * @date 2021-01-15 11:26:08
     */
    public enum ChannelRuleEnum {
        /**
         * APP 移动客户端
         */
        APP("APP",new AppChannelRule()),
        /**
         * PC 网页版
         */
        PC("PC",new PcChannelRule()),
        ;
    
        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;
        }
    }

    4、调用

    
    
    public static void main(String[] args) {
    String sign = "APP";
    ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);
    if(channelRule == null){
    System.out.println("找不到该标识");
    return;
    }
    GeneralChannelRule rule = channelRule.channel;
    rule.apply(sign);
    }
    
    

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

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

  • 相关阅读:
    java基础教程-流IO(五)
    java基础教程-常用类(四)
    java基础教程-容器(三)
    java基础教程-异常处理(二)
    java基础教程-面向对象(一)
    javascript DOM编程艺术(笔记)
    二十二、动态规划
    二十一、所有结点对最短路径问题(弗洛伊德算法)
    二十、单源最短路径(迪杰斯特拉算法)
    十九、最小生成树(普里姆算法)
  • 原文地址:https://www.cnblogs.com/dongl961230/p/14267531.html
Copyright © 2011-2022 走看看