zoukankan      html  css  js  c++  java
  • 规则引擎之easyRules

    规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言:

    You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions.
    虽然一个完美的规则引擎不会这么简单,但是如果你只是想要一个够用的规则引擎,这个定义就还蛮清楚的。
    同样就有人根据这个想法,已经实现了一个简单的规则名字,easyRules,好吧,名字也是简单。下面我们就看看如何使用这个规则引擎。
    首先还是先定义了一个接口,这个不是必须的,只是为了后续使用方便:
    public interface IRule {
        void setInput(JobEntity jobEntity);
        String getDescription();
    }

    基类有一些基本的实现,注意action和priority的注解:

    public abstract class BaseRule implements IRule{
        protected JobEntity value;
        private String desc;
    
        public BaseRule(String desc){
            this.desc = desc;
        }
    
        @Override
        public String getDescription() {
            return desc;
        }
    
        @Override
        public void setInput(JobEntity jobEntity){
            this.value = jobEntity;
        }
    
        @Action
        public void printWarning(){
            System.out.print(....);
        }
    
        @Priority
        public int getPriority(){
            return 1;
        }
    }

    真正的一个实现类,condition的注解用来判断是否触发:

    @Rule
    public class BlackListUserRule extends BaseRule{
        private List<String> blackList = new ArrayList<>();
    
        public BlackListUserRule(RuleItemEntity ruleItemEntity){
            super(ruleItemEntity.getDesc()) ;
    
            if (ruleItemEntity.getBwType().equalsIgnoreCase(Constants.CHECK_BLACKLIST) &&
                    ruleItemEntity.getCheckType().equalsIgnoreCase(Constants.CHECK_USER) &&
                    null != ruleItemEntity.getCheckValue()) {
                String[] users = ruleItemEntity.getCheckValue().split(";");
                blackList.addAll(Arrays.asList(users));
            }
        }
    
        @Condition
        public boolean inBlackList(){
            if(blackList.size() == 0){
                return false;
            }
    
            return blackList.contains(value.getUser());
        }
    
    }

    还支持多个规则组成的实现:

    public class MultipleRules extends CompositeRule implements IRule{
    
        public MultipleRules(Object... rules){
            for (Object rule : rules) {
                addRule(rule);
            }
        }
    
        @Override
        public void execute() throws Exception {
            super.execute();
            System.out.println("CompositeRule reached.");
        }
    
        @Override
        public void setInput(JobEntity jobEntity) {
            if (!rules.isEmpty()) {
                for (Rule rule : rules) {
                    if (rule instanceof IRule) {
                        IRule iRule = (IRule) rule;
                        iRule.setInput(jobEntity);
                    }
                }
            }
        }
    }

    在建立完rule之后,就是如何使用了

    RulesEngine jobRulesEngine= RulesEngineBuilder.aNewRulesEngine().withSkipOnFirstAppliedRule(false)
                    .withSilentMode(true).build();
    
     for (RuleEntity ruleEntityEnt : ruleEntityEntList) {
                IRule rule = RuleFactory.getRule(ruleEntityEnt);
                if (null != rule) {
                    jobRulesEngine.registerRule(rule);
                    ruleList.add(rule);
                }
            }
    
     for (IRule rule : ruleList) {
                rule.setInput(jobEntity);
            }
    
            jobRulesEngine.fireRules();

    上面的代码只是一个示意,稍微改下就可以运行。

    别忘了添加依赖:

    <dependency>
    <groupId>org.easyrules</groupId>
    <artifactId>easyrules-core</artifactId>
    <version>2.4.0</version>
    </dependency>

    版本现在好像已经到3.3了 而且改动蛮大 上面的代码在3.3里可能不能运行。
  • 相关阅读:
    ANSYS文件读写
    ANSYS导出图片
    由面网格拉伸为体网格
    ANSYS由结点生成单元
    photoshop做gif图片的问题
    matlab输出没有白边的图片
    关于ANSYS绘图显示结果范围的问题
    ansys的建模基于的坐标系问题
    ANSYS分析轴对称问题
    ANSYS取消坐标轴显示,关闭局部坐标系
  • 原文地址:https://www.cnblogs.com/029zz010buct/p/10497199.html
Copyright © 2011-2022 走看看