drools6入门例子(二)

产品规则如下:

1:单个产品数量超过2个,该产品打9折

2:总价格超过1000,立减50

新建maven项目,加入drools的依赖

<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-core</artifactId>
	<version>6.2.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-compiler</artifactId>
	<version>6.2.0.Final</version>
</dependency>

创建Fact

package com.lala.bean;

/**
 * 产品
 */
public class Product
{
	private String name;
	private Integer count = 1; //数量
	private double price; //价格
	private double discount = 1;	//折扣
	public Product(String name, double price)
	{
		this.name = name;
		this.price = price;
	}
	public Product(String name, double price, Integer count)
	{
		this.name = name;
		this.price = price;
		this.count = count;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public Integer getCount()
	{
		return count;
	}
	public void setCount(Integer count)
	{
		this.count = count;
	}
	public double getPrice()
	{
		return price;
	}
	public void setPrice(double price)
	{
		this.price = price;
	}
	public double getDiscount()
	{
		return discount;
	}
	public void setDiscount(double discount)
	{
		this.discount = discount;
	}
	/**
	 * 金额
	 */
	public double getPay()
	{
		return price * count * discount;
	}
	public String toString()
	{
		return "[name="+name+",price="+price+",count="+count+",discount="+discount+",getPay()="+getPay()+"]";
	}
}
package com.lala.bean;

import java.util.List;

/**
 * 订单
 */
public class Order
{
	private Integer id;
	private List<Product> products;
	private double cash = 0;	//返现
	public Integer getId()
	{
		return id;
	}
	public void setId(Integer id)
	{
		this.id = id;
	}
	public List<Product> getProducts()
	{
		return products;
	}
	public void setProducts(List<Product> products)
	{
		this.products = products;
	}
	/**
	 * 总金额
	 */
	public double getTotal()
	{
		double total = 0;
		for(Product product : products)
		{
			total += product.getPay();
		}
		return total;
	}
	/**
	 * 实际支付金额
	 */
	public double getPay()
	{
		return getTotal() - cash;
	}
	public double getCash()
	{
		return cash;
	}
	public void setCash(double cash)
	{
		this.cash = cash;
	}
}

drools规则:

package com.order;

import com.lala.bean.Product;
import com.lala.bean.Order;

rule "products"
	salience 2
    when
    	$order : Order();
    	$product : Product(count >= 3) from $order.products;//从list中取出每个product
    then
    	$product.setDiscount(0.9);//产品数量超过2个,则该产品打9折
end

rule "order"
	salience 1
    when
    	order:Order(getTotal() > 1000);
    then
    	order.setCash(50);//总价钱超过1000,立减50
end

测试:

package com.lala.mydrools;

import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import com.lala.bean.Order;
import com.lala.bean.Product;

public class OrderTest
{
	static KieSession getSession()
    {
        KieServices ks = KieServices.Factory.get();

        KieContainer kc = ks.getKieClasspathContainer();

        return kc.newKieSession("simpleRuleKSession");
    }
    public static void main(String[] args)
    {
        KieSession ks = getSession();

        Order order = new Order();

        List<Product> products = new ArrayList<>();
        products.add(new Product("MP3", 120, 2));
        products.add(new Product("MP4", 200));
        products.add(new Product("TCL电视", 3000));
        products.add(new Product("红米note2", 799, 5));

        order.setProducts(products);

        ks.insert(order);
        int count = ks.fireAllRules();
        System.out.println("总执行了"+count+"条规则");
        System.out.println("实际需要支付:" + order.getPay());
        ks.dispose();
    }
}

最后输出结果为:

总执行了2条规则

实际需要支付:6985.5

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-30 00:07:23

drools6入门例子(二)的相关文章

drools6入门例子

项目结构如下: pom.xml依赖: <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>6.2.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> &l

[WebGL入门]十二,模型数据和顶点属性

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 顶点属性的意思 上次的文章中,介绍了一下从着色器的生成,编译,到程序对象的生成和着色器的连接.这次,简单的说一下模型数据的定义和顶点属性的处理.另外,介绍一下根据模型数据生成VBO的方法.VBO的使用要比生成难理解一些,但是不要担心,后面会慢慢说明.接下来看一下顶点属性.顶点属性,说的简单点,

Java入门(二)——果然断更的都是要受惩罚的。。。

断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写吧. 现在开展的“业务”,一个是PHP,一个是Android开发. 前者偏向于三个方向,总结之前的(看书,敲代码实现),电商网站的开发,一些技能的实现: 后者起步阶段,一边Java学习,一边动手做东西出来,争取一周内有个交代吧先. 今天还比较坑一点,把昨天弄的卸载了,AS中的虚拟界面用不了,用哥们儿

DataVeryLite入门教程(二) Entity篇

DataVeryLite 是基于.net 4.0的数据库持久化ORM框架. 目前支持的数据库有Sqlserver,Mysql,Oracle,Db2,PostgreSql,Sqlite和Access. 最好先阅读DataVeryLite入门教程(一) 配置篇,然后再阅读本篇.如果你觉得麻烦也可以跳过. Entity是ORM中的核心对象之一,一个继承Entity的对象对应于数据库中的一个表. Entity提供丰富的API对表中的单条数据进行操作. 比如根据id或其他条件,加载,删除,插入,更新和部分

Spring Cloud 入门教程(二): 配置管理

使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用.随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切.服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具.很容易添加

HBase Client API使用入门(二)---查询及过滤器

相关知识 创建表插入数据删除等见:http://www.cnblogs.com/wishyouhappy/p/3735077.html HBase API简介见:http://www.cnblogs.com/wishyouhappy/p/3753347.html 按行.列簇等查询 package wish.hbase; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org

HTML5- Canvas入门(二)

上篇文章我们了解了canvas的定义.获取和基础的绘图操作,其中的绘图功能我们讲解了线段绘制.上色.描边等方面知识点. 今天我们来讲讲矩形(Rectangle)和多边形的绘制. 矩形的绘制一共有两个口令,分别是 ctx.fillRect(x, y, width, height) 和 ctx.strokeRect(x, y, width, height) ,参数中的 x 和 y 依旧表示需绘制的矩形的起始点坐标(相对canvas原点),width 和 height表示需绘制的矩形宽高. 而 fil

Android 自定义控件开发入门(二)

上一次我们讲了一堆实现自定义控件的理论基础,列举了View类一些可以重写的方法,我们对这些方法的重写是我们继承View类来派生自定义控件的关键 我通过一个最简单的例子给大家展示了这一个过程,无论是多么复杂的自定义控件,思路总是这样子的,但是因为我们仅仅重写了onDraw方法使得大家觉得怪怪的,作为一个控件,我们居然还要为了他的实现为其增加麻烦的监听,这就不能叫做控件了. 下面再给大家介绍一个经常重写的方法法:publicboolean onTouchEvent (MotionEvent even

CMake入门(二)

CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版,Visual Studio 203 Update1英文版,CMake 2.8.12.2. Cent OS 6.5. 内容简介 介绍在VisualStudio上现有的项目如何移植到Linux上.本文通过列出两个最简单.也是最常用的例子来介绍Linux下CMake的使用. CentOS 上安装CMake 2.8.1