规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。应用背景: 企业级管理者对企业IT系统的开发有着如下的要求:

1. 为提高效率,管理流程必须自动化,即使现代商业规则异常复杂。

2. 市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新。

3. 为了快速、低成本的更新,业务人员应能直接管理IT系统中的规则,不需要程序开发人员参与。

  下面介绍一个开源的引擎(NXBRE  Rule-engine)实现动态折扣价格计算:

  折扣逻辑配置使用XML(扩展名.xbre)为文件,后期修改XML打折策略,在程序代码无需修改的情况,实现柔性折扣策略的目的。

  折扣规则文件:discount.xbre 

 <?xml version="1.0" encoding="UTF-8"?>
<xBusinessRules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xBusinessRules.xsd">
<!-- 全局变量-->
<Integer id="10i" value="10"/>
<Integer id="40i" value="40"/>
<ObjectLookup id="QuantityOrdered" objectId="CurrentOrder" member="Quantity"/>
<Logic>
<If>
<And>
<GreaterThanEqualTo leftId="ClientRating" rightId="ClientRatingThreshold">
<!-- CurrentOrder为订单对象-->
<ObjectLookup id="ClientRating" objectId="CurrentOrder" member="ClientRating"/>
<String id="ClientRatingThreshold" value="C"/>
</GreaterThanEqualTo>
</And>
<Do>
<!-- 对于评分高的客户指定的折扣策略 Discount rules for high rate customers -->
<Logic>
<If>
<And>
<GreaterThan leftId="QuantityOrdered" rightId="40i"/>
</And>
<Do>
<!-- AppliedDiscount为应用的折扣-->
<Evaluate id="AppliedDiscount">
<!-- Percent为折扣比例-->
<Parameter name="Percent" value=".7"/>
</Evaluate>
</Do>
</If>
<ElseIf>
<And>
<GreaterThan leftId="QuantityOrdered" rightId="10i"/>
</And>
<Do>
<Evaluate id="AppliedDiscount">
<Parameter name="Percent" value=".8"/>
</Evaluate>
</Do>
</ElseIf>
<Else>
<Evaluate id="AppliedDiscount">
<Parameter name="Percent" value=".9"/>
</Evaluate>
</Else>
</Logic>
</Do>
</If>
<Else>
<!-- 对于评分低的客户指定的折扣策略 Discount rules for low rate customers -->
<Logic>
<If>
<And>
<GreaterThan leftId="QuantityOrdered" rightId="40i"/>
</And>
<Do>
<Evaluate id="AppliedDiscount">
<Parameter name="Percent" value=".9"/>
</Evaluate>
</Do>
</If>
<Else>
<Evaluate id="AppliedDiscount">
<Parameter name="Percent" value="1"/>
</Evaluate>
</Else>
</Logic>
</Else>
</Logic>
</xBusinessRules>

  所有的业务逻辑都在discount.xbre 中定义,下面我们定义一个窗体来解析折扣逻辑并显示计算的结果:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using NxBRE.FlowEngine;
using NxBRE.FlowEngine.IO;
using BREFactory = NxBRE.FlowEngine.Factories.BREFactory;
using Reflection = NxBRE.Util.Reflection;
namespace WinApp
{
public partial class frmDiscountRBE : Form
{
public frmDiscountRBE()
{
InitializeComponent(); } /// <summary>
/// 规则xml文件名称
/// </summary>
public const string FLOW_RULES_FILENAME = "discount.xbre";
public const string ORDER = "CurrentOrder";
public const string APPLIED_DISCOUNT = "AppliedDiscount";
public const string PERCENT = "Percent";
/**/
/// <summary>
/// 定单
/// </summary>
struct Order
{
public Int32 Quantity;
public Double TotalCost;
public string ClientRating;
public Order(int _q, double _t, string _c)
{
this.Quantity = _q;
this.TotalCost = _t;
this.ClientRating = _c;
}
}
/**/
/// <summary>
/// 计算结果
/// </summary>
/// <param name="aBRC">规则引挚上下文</param>
/// <param name="aMap"></param>
/// <param name="aStep"></param>
/// <returns>结果</returns>
static object AppliedDiscount(IBRERuleContext aBRC, IDictionary aMap, object aStep)
{
Order _order = (Order)aBRC.GetObject(ORDER);
double _d = Convert.ToDouble(Reflection.CastValue(aMap[PERCENT], typeof(double)));
return _order.TotalCost * _d;
}
private void btnDiscount_Click(object sender, EventArgs e)
{
try
{
//载入规则
IRulesDriver rulesDriver = new XBusinessRulesFileDriver(FLOW_RULES_FILENAME);
//工厂
BREFactory breFactory = new BREFactory();
//引挚实例
IFlowEngine bre = breFactory.NewBRE(rulesDriver);
//委托实例
ExecuteRuleDelegate executeRuleDelegate = new ExecuteRuleDelegate(AppliedDiscount);
bre.RuleContext.SetFactory(APPLIED_DISCOUNT, new BRERuleFactory(executeRuleDelegate));
//设置规则引挚环境变量
//Order order = new Order(5, 25, "A");
Order order = new Order(Int32.Parse(this.txtQuantity.Text), Double.Parse(this.txtTotalCost.Text), this.txtClientRating.Text);
bre.RuleContext.SetObject(ORDER, order);
//执行
bre.Process();
//得到执行结果
double result = (double)bre.RuleContext.GetResult(APPLIED_DISCOUNT).Result; this.txtPayCost.Text = result.ToString();
this.txtPayCost.ReadOnly = true;
//Console.Out.WriteLine("\nOrder: Calculated discounted total={0} (expected: {1})\n",
// result, 25);
//Console.ReadLine();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void frmDiscountRBE_Load(object sender, EventArgs e)
{ } }
}

  运行程序,界面如下:

数量>40,折扣0.7 数量大于10且小于40,折扣0.8

基于NXBRE规则引擎实现的柔性折扣策略的更多相关文章

  1. 【java规则引擎】一个基于drools规则引擎实现的数学计算例子

    最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...

  2. WebSphere ILOG JRules 规则引擎运行模式简介

    WebSphere ILOG JRules 规则引擎运行模式简介 引言 作为 JRules 的核心组件,规则引擎决定了在规则集的执行过程中,哪些业务规则会被执行,以及以何种顺序执行.理解并合理选择规则 ...

  3. 规则引擎在IoT的重要性?

    前言 物联网的强大功能主要来自于它使我们能够实时做出更准确的决策的能力,这些在通知.自动化和预测性维护上都有所体现.因此我们需要能对实时数据进行实时响应的工具,答案就是规则引擎.规则引擎可以通过摄取实 ...

  4. 基于Flink和规则引擎的实时风控解决方案

    案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后 ...

  5. 规则引擎-BRMS在企业开发中的应用

    1. 什么是规则复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其 ...

  6. SNF快速开发平台--规则引擎整体介绍及使用说明书

    一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...

  7. C# RulesEngine 规则引擎:从入门到看懵

    说明 RulesEngine 是 C# 写的一个规则引擎类库,读者可以从这些地方了解它: 仓库地址: https://github.com/microsoft/RulesEngine 使用方法: ht ...

  8. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  9. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

随机推荐

  1. 那些年我们写过的T-SQL(中篇)

    中篇的重点在于,在复杂情况下使用表表达式的查询,尤其是公用表表达式(CTE),也就是非常方便的WITH AS XXX的应用,在SQL代码,这种方式至少可以提高一倍的工作效率.此外开窗函数ROW_NUM ...

  2. 探讨Nodejs中的作用域问题。

    在JS中有全局作用域和函数作用域,而在Nodejs中也自己的作用域,分为全局作用域(global)和模块作用域. js作用域: 以前学js的时候我们的全局对象是window,如: var a = 10 ...

  3. dubbox

    github源码: https://github.com/dangdangdotcom/dubbox maven中央仓: 无 获取分支 git clone -b dubbox-2.8.4 https: ...

  4. Android入门(二十)HttpURLConnection与HttpClient

    原文链接:http://www.orlion.ga/679/ 在 Android上发送 HTTP请求的方式一般有两种,HttpURLConnection和 HttpClient. 一.HttpURLC ...

  5. 移动web开发之屏幕三要素

    × 目录 [1]屏幕尺寸 [2]分辨率 [3]像素密度 前面的话 实际上,并没有人提过屏幕三要素这个词,仅是我关于移动web开发屏幕相关部分总结归纳的术语.屏幕三要素包括屏幕尺寸.屏幕分辨率和屏幕像素 ...

  6. 了解HTML表单之input元素的30个元素属性

    目录 传统属性 name type accept alt checked disabled readonly maxlength size src value 新增属性 autocomplete au ...

  7. 这10道javascript笔试题你都会么

    1.考察this var length = 10; function fn() { console.log(this.length); } var obj = {   length: 5, metho ...

  8. Docker - 在CentOS 7中安装Docker

    1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname -a Linux CentOS-7 3. ...

  9. C#获取年龄段 几零后

    /// <summary> /// 根据年龄获得年龄段 /// </summary> /// <param name="age"></pa ...

  10. Redhat7.2 如何修改主机名(hostname)?

    Redhat7.2 在安装的时候,会默认生成主机名:localhost. 那么如何修改成自己想要的自己名? //格式为:用户名@主机名 比如: [root@localhost ~]#  修改成[roo ...