数据库/基于XML的类名、
想象一下,如果你将类的名字存放在一个数据库表、XML文件或者是一个纯文本文件时,会出现什么情况?在加入新的价格计划时,你只需要创建一个新的类,并且将它放到一个
程序可以找到的地方,然后在数据库表或者文件中加入一个记录就可以了。这样在一个新的标价计划推出时,你就不必每次修改Trade类。这里我将使用纯文本文件来说明,因为这是最简单的方法。在一个真正的系统中,我将建议使用数据库或者是一个XML文件,因为它们更加灵活。该文本文件如下所示:
文件名: PricingPlans.txt
1,string_interfaces.PricingPlan20 2,string_interfaces.PricingPlan1510 3,string_interfaces.PricingPlan8 4,string_interfaces.PricingPlan10 |
现在你就可以创建一个PricingPlanFactory类,它将可以根据传入的PlanId来返回一个IPricingPlan实例。这个类读取和分析该文本文件至一个Map中,这样它就可以很方便地根据PlanId进行查找。要注意的是,你也可以修改PricingPlanFactory类以使用一个数据库或者XML文件。
你可以重新
设计Customer类,以便返回IPricingPlan实例而不是PlanId。这样的设计要比返回一个PlanId好,因为其它的类将不需知道它们必须传送PlanId到PricingPlanFactory()方法。这些类不需知道PricingPlanFactory的任何东西;它们只使用所需的IPricingPlan实例就可以了(前面我使用这个设计的原因是这样更便于表达我的观点)。
这些修改都可以在这篇文章的源代码包中的pricing_plan_factory package找到。
要注意的方面
在这篇文件附带的源代码包中(DynamicJavaSource.zip),每个pachage都包含有一个Test类。以下的表描述了这些包中包含有那些东西:
Package 描述
no_interfaces 没有使用interfaces的例子
hard_coded_interfaces 使用interfaces,但是类名写入到源代码中的例子
string_interfaces 使用interfaces,类名以字符串的形式写到源代码中的例子
pricing_plan_factory 使用一个文本文件来得到一个类名的例子
对于类载入的方面,有个问题要注意:类载入的工作有时会出现意外。例如,如果调用forName()方法的类是一个扩展,将不会在CLASSPATH的目录中搜索这个被动态载入的类。如果你想了解关于这个问题的深入讨论或者ClassNotFoundExceptions的一些意外,你可以参考http://
java.sun.com/products/jdk/1.3/docs/guide/extensions/index.html。
你还要注意本文末提到的一个技巧,就是为你的接口加上版本号,以避免当你的程序修改时,令动态扩展无效。