学着学设计--货物分发站的信息系统

Subject: 一个货物分发站的信息系统

Description: 有一个货物分发站,专门负责将客户送来的货物,按照一定规则来分类统计,然后将分了类的货物按相应的运输方式再分发出去。

货物有如下属性:

价格,重量,体积,送货目的地,接收人,发送人,预计发送时间,预计到达时间

货物分类的规则可以是按照货物体积,重量等来分类。这个规则是根据客户要求变化的。当前货物的分类有3种,分别是类型1(价格大于1000美元的) ,类型2(除了类型1后剩下货物里重量大于10kg的),类型3(除了类型12后剩下的货物)。但是该分类规则会经常变化(比如下个月就可能会增加一种新类型:类型4——除了类型12后剩下货物里体积大于1立方米的货物,那么相应的类型3就将变成是除了类型124后剩下的货物)。

现在需要做一个货物统计系统,操作员将货物信息录入后,系统将根据货物的类型作不同的处理:

对于类型1的货物会将该货物的相关信息写入本地的Oracle数据库。

对于类型2的货物会将该货物的相关信息写入本地的SQL Server数据库

对于类型3的货物会将该货物的相关信息抛给远程的一个Web service接口。

(因为分类会有变化的时候,所以当这些分类发生变化的时候其货物的处理也会有相应变化)

请设计该系统的核心处理模块(UI,持久化以及和外部的接口部分可以简略),写出概要的设计方案。

我的设计方案:

      货物分类规则会有变化,而我们处理货物要依据这些分类规则。怎么办?应用开闭原则,隔离变化点!对于每一种分类规则,都有一定的判定条件和此分类下的相应处理。而对货物分类时则必须应用现有的所有规则,并用当前货物所属规则来处理。该货物统计系统的核心业务流程如下:


根据这些分析,容易得到以下类图:


每一个类为一个独立的Class Library.在客户端添加对IClassificatorFactoryIRuler的引用。在应用程序配置文件中添加ClassificatorFactoryRuler1,Ruler2,…的相关配置,然后动态加载相应的程序集,创建ClassificatorRuler1,Rule2,…的实例并添加到ClassificatorFilters集合中。

      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

posted on 2008-05-01 21:58  James.H.Fu  阅读(463)  评论(2编辑  收藏  举报

导航