您的位置:首页 > 其它

drools入门(二)-----规则引擎Drools解决汽水问题(复杂逻辑)

2015-07-22 15:47 316 查看
喝汽水问题:
1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有50元钱,最多可以喝到几瓶汽水?(不能借空瓶,呵呵无商不奸)

 

answer:

1: 如果有超过一元钱, 则买一瓶汽水喝, 此时: 钱减少一元,同时拥有的空瓶增加一个。

2: 如果拥有至少两个空瓶, 则两个空瓶卖给老板兜里的钱加一(或是两个空瓶卖给老板换来一瓶汽水)。

SoftDrink.drl

#created on: 2011-10-18

package com.jsptpd.rjy.zyj.main

dialect "mvel"

#list any import classes here.

import com.jsptpd.rjy.zyj.main.SoftDrink.Customer

#declare any global variables here

rule "和了一瓶汽水"

    when

        $c:Customer(money>0,$m:money, $e:emptyBottle, $d :drinkBottleSum);

    then

        $c.money=$m-1;

        $c.emptyBottle=$e+1;

        $c.drinkBottleSum=$d+1;

        System.out.println($c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");

        update($c);

end

rule "用两个空瓶换了一瓶汽水"

    when

        $c:Customer(emptyBottle>1,$e:emptyBottle, $d:drinkBottleSum);

    then

        $c.emptyBottle=$e-2+1;

        $c.drinkBottleSum=$d+1;

         System.out.println($c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");

        update($c);

end

rule "结束"

    no-loop true 

    when

         $c:Customer(money<=0,emptyBottle<2);

    then

         System.out.println("计算结束:"+$c.getName()+"有 "+$c.getMoney()+" 元, 有空瓶 "+$c.getEmptyBottle()+" 个, 喝了 "+$c.getDrinkBottleSum()+" 瓶。");

end

SoftDrink.java

 

package com.jsptpd.rjy.zyj.main;

import org.drools.KnowledgeBase;

import org.drools.KnowledgeBaseFactory;

import org.drools.builder.KnowledgeBuilder;

import org.drools.builder.KnowledgeBuilderError;

import org.drools.builder.KnowledgeBuilderErrors;

import org.drools.builder.KnowledgeBuilderFactory;

import org.drools.builder.ResourceType;

import org.drools.io.ResourceFactory;

import org.drools.logger.KnowledgeRuntimeLogger;

import org.drools.logger.KnowledgeRuntimeLoggerFactory;

import org.drools.runtime.StatefulKnowledgeSession;

public class SoftDrink {

/**
* @param args
*/
public static void main(String[] args) {
try {
KnowledgeBase knowledgeBase = readKnowledgeBase();
StatefulKnowledgeSession statefulKnowledgeSession = knowledgeBase
.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger knowledgeRuntimeLogger = KnowledgeRuntimeLoggerFactory
.newFileLogger(statefulKnowledgeSession, "test");
Customer customer=new Customer("小黄", 50, 0, 0);
statefulKnowledgeSession.insert(customer);
statefulKnowledgeSession.fireAllRules();
knowledgeRuntimeLogger.close();
statefulKnowledgeSession.dispose();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
knowledgeBuilder.add(ResourceFactory
.newClassPathResource("SoftDrink.drl"), ResourceType.DRL);
KnowledgeBuilderErrors knowledgeBuilderErrors = knowledgeBuilder
.getErrors();
if (knowledgeBuilderErrors.size() > 0) {
for (KnowledgeBuilderError knowledgeBuilderError : knowledgeBuilderErrors) {
System.out.println(knowledgeBuilderError);
}
throw new IllegalArgumentException("KnowledgeBuilder创建失败!");
}

KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(knowledgeBuilder
.getKnowledgePackages());
return knowledgeBase;
}

public static class Customer {
private String name = "";
private int money = 0;
private int emptyBottle = 0;
private int drinkBottleSum = 0;

public Customer(String name, int money, int emptyBottle,
int drinkBottleSum) {
super();
this.name = name;
this.money = money;
this.emptyBottle = emptyBottle;
this.drinkBottleSum = drinkBottleSum;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getMoney() {
return money;
}

public void setMoney(int money) {
this.money = money;
}

public int getEmptyBottle() {
return emptyBottle;
}

public void setEmptyBottle(int emptyBottle) {
this.emptyBottle = emptyBottle;
}

public int getDrinkBottleSum() {
return drinkBottleSum;
}

public void setDrinkBottleSum(int drinkBottleSum) {
this.drinkBottleSum = drinkBottleSum;
}
}

}

运行结果:

....

....

 

小黄有 2 元, 有空瓶 2 个, 喝了 94 瓶。

小黄有 2 元, 有空瓶 1 个, 喝了 95 瓶。

小黄有 1 元, 有空瓶 2 个, 喝了 96 瓶。

小黄有 1 元, 有空瓶 1 个, 喝了 97 瓶。

小黄有 0 元, 有空瓶 2 个, 喝了 98 瓶。

小黄有 0 元, 有空瓶 1 个, 喝了 99 瓶。

计算结束:小黄有 0 元, 有空瓶 1 个, 喝了 99 瓶。

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------- 

附件直接导入Eclipse中运行.

附件drl文件有java实现,这个是mvel实现。例外还有个重写的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: