改行了,不再做软件开发了,之前工作中做过的一些有价值的东西陆续发布在这,希望对其他人有用。

(图片看不到的话,请下载打包了文档和代码的附件^^)
------------------------------------------------------------
规则方案说明

方案简介:
规则方案的目标是对外提供规则(校验、计算等)服务。它提供了这样一套机制:1)针对特定对象类型,用户预先关联一些规则;2)运行时,用户传入对象实例,规则服务将找到并执行相应的规则,把结果返回给用户。
据此,对本方案的了解将着重于两方面:1)规则的实现及管理;2)使用运行时情况。

实现说明:
一、规则的实现
规则封装的是一小段逻辑过程,它所处理的数据或对象一般被称为事实。在编码实现具体规则之前,开发者应该大概的考虑一下以下几点问题:
1) 事实对象如何获得,处理结果如何收集并传递给用户?
2) 规则本身的执行如果依赖其他的资源(如:其他服务、数据等)或规则,如何处理?
3) 规则是否应可以配置,可以嵌套组合以形成更复杂的规则?如何配置和组合?

规则框架提供了一整套机制来回答上述问题,其大致情形可如下图所示:

RuleContext(环境对象)提供了规则执行时所需的一切:
a) 通过existFactObject(int factType, String conditions)、getFactObject(int factType, String conditions)和getFactObjects(int factType, String conditions)方法,规则可以判断执行时所需要的事实对象的存在与否,并获取之;
b) 通过addResult(String name, Object resultValue)和addError(String occurPlace, String errorCode, String errorContent)方法,规则可以提交执行结果或错误;
c) 通过getServComponent(int servType)方法,规则可以获得执行时所需的其他资源对象。
规则接口只有一个方法:execute(RuleContext ctx)。

为了便于扩展和重用,规则实现类可以(可选的)实现Configurable接口。所声明的参数的具体值将在规则管理时指定,并且该规则类实例投入运行前由框架设置好。
为了实现规则的嵌套组合(把一系列规则组合成一个针对特定目的运行的整体),结构中引入了RuleSet接口,它和Rule接口构成了一个组合模式。用户可以在规则管理时给实现了RuleSet接口的实现类加入一系列其他规则来实现规则的嵌套。

PS:当用户可以方便的获得RuleContext实现时,规则开发中的测试将非常简单,只需在实例化相应的规则实现类后给execute()方法传入RuleContext实现对象即可,执行结果可以直接从RuleContext实现对象的相应方法获得。

二、规则的管理
规则管理的主接口是:RuleInfoService,它的实现类负责规则实现类的登记/注册、元规则描述的分门别类和预配置、实际规则描述与特定对象类型的关联和存取等。相应的过程如下图所示:

注:运行时,规则服务将会根据(实际)规则描述的信息实例化相应的规则实现类,并用规则描述中的配置信息去配置它。这样配置好的规则就处于可执行状态下了。

三、运行时情况
RuleService接口是本框架/方案运行时的主接口,它的实现类负责根据传入的带校验对象查找相应的规则,创建RuleContext实例,运行规则,并抽取结果信息返回给用户。实际实现中的相应过程如下图所示:

1) 用户要求校验目标对象;
2) 规则服务先根据目标对象以及其他资源服务对象创建了RuleContext实例;
3) 规则服务接着问规则信息服务索要和目标对象相关的规则描述信息;
4) 针对每一条规则描述信息:
i) 获得相应的规则实例;
ii) 用规则描述中的配置信息配置它。
5) 从根规则开始,传入创建好的RuleContext实例嵌套的执行所有规则;
6) 从RuleContext实例中提取出错信息返回给用户

最后值得提及的是,该方案支持规则的跨网络传输,可以运行在客户端构建的同样环境下。这样用户对象可以在客户端即时校验,获得更好的速度体验。并且,可以实现规则的服务器端集中部署,用户使用时动态加载和更新。
实现的要点是,规则开发者首先应通过接口方式获得和调用资源对象的方法,而由框架在创建RuleContext实例时根据客户端和服务器端程序运行环境的不同给它设置这些资源服务接口的不同实现。

使用要点:
规则方案实际上定义了三个相关的角色:
规则开发者——开发在特定事实环境下运行,可以做出相应判断或得出相应结果的规则实现类;
规则管理者——规则的注册、分门别类、配置、关联等;
规则服务用户——使用规则服务校验相应对象或计算相应结果。

三种角色的人员通力合作,才能达到规则的统一管理、扩展和重用、使用简单等方案所追求的目标。文件“com.ctic.core.prod.common.rule.RuleServiceTest.java”展示了一个简单而完整的例子,可以看看。
  • rule_framework.rar (78.2 KB)
  • 描述: 规则框架方案--文档及代码
  • 下载次数: 34
评论
tminglei 2008-05-21
下载这个方案文档的人可能会有点失望,因为这个方案远谈不上出色和完善。
不过,当发现现成框架没有提供量身定做的方案,而需要结合现有环境组合现有资源时,希望这个方案能你点帮助,毕竟这个方案还是足够简单、清晰,所考虑的也是相关的应用开发中的一些重要的问题

自己开发一个强大完善的规则框架,从大的方面来看不是一个好的想法,特别是对于我们绝大多数做项目开发的人来说。
发表评论

您还没有登录,请登录后发表评论

tminglei
搜索本博客
最近加入圈子
最新评论