规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。应用背景: 企业级管理者对企业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. jQuery学习易忘细节

    1.类似于alert(""),但不会中断页面操作:console.log("last"); 2.javascript是HTML5以及所有现代浏览器中的默认脚本语 ...

  2. java中的显示初始化和特定初始化

    public class Test{ public static void main(String[] args){ Child child = new Child(); } } class Pare ...

  3. 邻接表无向图(三)之 Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http:/ ...

  4. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  5. web开发者谷歌浏览器常用插件

    1.Allow-Control-Allow-Origin    安装此插件解决跨域问题,在本地起服务器可访别的域的数据. 需在Access-Control-Expose-Headers加上Allow- ...

  6. 利用ListView的基本方法实现效果

    日常的开发工作经常需要ListView作为布局的组件,而且很多时候都会遇到需要自定义ListView的情况. 也有些问题并不需要自定义的ListView,基于原生的ListView就能实现,但需要灵活 ...

  7. java基础--相等

    学习:http://www.cnblogs.com/dolphin0520/p/3780005.html#3163302 后发现居然有这么个东西,当然也不会注意什么自动拆箱和装箱,只知道用就行了.不过 ...

  8. iOS Swift编程语言

    Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序. Swift是一款易学易用的编程 ...

  9. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  10. Fiddler使用AutoResponder进行本地文件和线上文件的映射

    直入正题.. 刚刚想写篇总结,照常登上博客园添加新随笔,写了百来字发现有什么不对劲 编辑器去哪儿了... 心想重新登录应该就OK了吧,点击退出然后重新登录 按钮一直显示加载中...简直就没法登录嘛.. ...