快速业务通道

动态扩展Java应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
创建一个PricingPlan类的数组时,情况又如何呢?

类名: Trade

public class Trade extends Object { private Customer customer; private static final String[] pricingPlans = { "string_interfaces.PricingPlan20", "string_interfaces.PricingPlan1510", "string_interfaces.PricingPlan8", "string_interfaces.PricingPlan10" };

现在你可以将getCommissionPrice()方法修改为:

类名: Trade

public double getCommissionPrice() { double commissionPrice = 0.0; IPricingPlan plan; Class commissionClass; try { commissionClass = Class.forName( pricingPlans[ getCustomer().getPlanId() - 1 ] ); plan = (IPricingPlan) commissionClass.newInstance(); commissionPrice = plan.calculateCommission( this ); } // ClassNotFoundException, InstantiationException, IllegalAccessException catch( Exception e ) { System.out.println( "Exception occurred: " + e.getMessage() ); e.printStackTrace(); } return commissionPrice; }

如果不将例外处理的部分计算在内,这里的代码是我们见过最简单的。在需要加入新的标价计划时,也相对地简单。你只要在Trade类中的数组中创建就可以了。

我想你已经开始看到动态类载入的强大了吧。

你还可以改进这个设计,以便在加入新的价格计划时更加简单,上面方法的缺点是,在加入一个新的价格计划后,你仍然必须重新编译包含有Trade类的源代码。

动态扩展Java应用(4)

时间:2010-12-17

数据库/基于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 使用一个文本文件来得到一个类名的例子

对于类载入的方面,有个问题要注意:类载入的工作有时会出现意外。例如,如果调用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号