申利民
骑士
骑士
  • UID582
  • 粉丝0
  • 关注0
  • 发帖数11
阅读:4662回复:0

if else 的优化

楼主#
更多 发布于:2020-05-10 18:05
PS: 在做数据清洗,因为不同的规则要走不同的路线,一般情况下if else 或者switch 能解决,但是当清洗规则达到几十个规则,弊端就出现了,大量的if else 极丑,且每次新增一条规则都要else 一下还需要在逻辑上改动之前的代码极其不便。以下是是网上以及综合了自己的实际及想法,已解决该问题的方案。顺便学习设计模式。


总体思路:定义一个抽象统一的方法,,每次有新的清洗规则,就实现它。然后注册到工厂中的静态容器中。每次新的规则来了,去静态容器获取相关的class,实例化后调用run()就阔以了。  
另外:其中注册到工厂方法可以使用数据库配置的方式或者使用注解的方法来实现。


数据库:方式麻烦,其次新增都要去操作数据库。
注解: 每次新增一个清洗规则都需要重启启动,让扫描器随系统去自动扫描去注册。(推荐)


1、第一个是编写一个抽象的方法。ICleaningContainer.java

public interface ICleaningContainer {
void run() throws Exception;

}

2、定义工厂cleaningContainerFactory.java

public class cleaningContainerFactory {

    private static final ICleaningContainer EMPTY = new EmptyCleaningContaine();

    private static Map<String, ICleaningContainer> punishMap = new HashMap<String, ICleaningContainer>();

    // 默认已经注册完成
    static {
        System.out.println(1);
        registerPunish();
    }

    public static ICleaningContainer getPunish(String state) {
        ICleaningContainer result = punishMap.get(state);
        return result == null ? EMPTY : result;
    }

    private static void registerPunish() {
        //实现各个实现的接口方法放到punishMap容器中 可考虑数据库获取配置 或者注解
        punishMap = CleanerAchieve.punishMap;
    }

    private static class EmptyCleaningContaine implements ICleaningContainer {
        @Override
        public void run() {
            System.out.println("定义了一个空的");
        }
    }

}

3、注解Cleaner.java 然后自行去实现逻辑

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cleaner {

    String cleanType();

}


4、产生两个清洗规则 Action1 、Action2 分別是实现ICleaningContainer的方法

@Cleaner(cleanType = "规则1")
public class Action1 implements ICleaningContainer {


    @Override
    public void run() throws Exception {
        System.out.println("执行了规则1的方法");
    }
}



@Cleaner(cleanType = "规则2")
public class Action2 implements ICleaningContainer {


    @Override
    public void run() throws Exception {
        System.out.println("执行了规则2的方法");
    }
}




5、最后测试



public class Test {


    public static void main(String[] args) throws Exception {
        //模拟注解扫描
        CleanerAchieve.start();


        String cleanType = "规则1";
        ICleaningContainer container = cleaningContainerFactory.getPunish(cleanType);
        container.run();
    }
}




================最后的结果================

执行了规则1的方法


Process finished with exit code 0




执行了规则1的方法,然后就轻易解决了,if else 的问题,且当新增一个清洗规则后,直接新加一个规则类即可。不需要改动之前的逻辑。


在实际中的生产中可能会更复杂。比如清洗会加一些清洗的规则。那个需要做什么操作,需要更多的信息项。




欢迎留言讨论。。
游客

返回顶部