`
啸笑天
  • 浏览: 3436532 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

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实现。例外还有个重写的。

 

 

 

分享到:
评论
1 楼 smallduck155 2015-05-07  
嗯,学习了。感觉挺不错的

相关推荐

Global site tag (gtag.js) - Google Analytics