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

喝汽水问题:
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实现。例外还有个重写的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值