Subject: 一个货物分发站的信息系统
Description: 有一个货物分发站,专门负责将客户送来的货物,按照一定规则来分类统计,然后将分了类的货物按相应的运输方式再分发出去。
货物有如下属性:
价格,重量,体积,送货目的地,接收人,发送人,预计发送时间,预计到达时间
货物分类的规则可以是按照货物体积,重量等来分类。这个规则是根据客户要求变化的。当前货物的分类有3种,分别是类型1(价格大于1000美元的) ,类型2(除了类型1后剩下货物里重量大于10kg的),类型3(除了类型1,2后剩下的货物)。但是该分类规则会经常变化(比如下个月就可能会增加一种新类型:类型4——除了类型1,2后剩下货物里体积大于1立方米的货物,那么相应的类型3就将变成是除了类型1,2,4后剩下的货物)。
现在需要做一个货物统计系统,操作员将货物信息录入后,系统将根据货物的类型作不同的处理:
对于类型1的货物会将该货物的相关信息写入本地的Oracle数据库。
对于类型2的货物会将该货物的相关信息写入本地的SQL Server数据库
对于类型3的货物会将该货物的相关信息抛给远程的一个Web service接口。
(因为分类会有变化的时候,所以当这些分类发生变化的时候其货物的处理也会有相应变化)
请设计该系统的核心处理模块(UI,持久化以及和外部的接口部分可以简略),写出概要的设计方案。
我的设计方案:
货物分类规则会有变化,而我们处理货物要依据这些分类规则。怎么办?应用开闭原则,隔离变化点!对于每一种分类规则,都有一定的判定条件和此分类下的相应处理。而对货物分类时则必须应用现有的所有规则,并用当前货物所属规则来处理。该货物统计系统的核心业务流程如下:
根据这些分析,容易得到以下类图:
每一个类为一个独立的Class Library.在客户端添加对IClassificatorFactory和IRuler的引用。在应用程序配置文件中添加ClassificatorFactory和Ruler1,Ruler2,…的相关配置,然后动态加载相应的程序集,创建Classificator、Ruler1,Rule2,…的实例并添加到Classificator的Filters集合中。
Classificator.Classify(Product p)的核心代码如下:
foreach(IRuler r in filters)
{
If(r.Validate(p))
{//p 属于r的分类规则
r.Classify(p);//按r 的分类规则进行处理
break;//基于分类的惟一性
}
}
假如因为我们的业务需求,分类规则有变化,有更多更细的分类,那么只需要添加相应的Ruler(s),并把程序集、全类名添加到配置文件中即可,在程序重新启动时即可加载所有的Ruler.
2007-12-24