动态扩展Java应用(二)

2014-11-23 21:35:09 · 作者: · 浏览: 23
新的价格计划。你可以加入更多的if/then/else句子,但这不是一个好方法,如果价格计划变得越来越多时,代码将会显得十分笨重。另一个选择是通过Class.forName() 方法来创建PricingPlan实例,而不是通过new。Class.forName()方法可让你通过一个字符串名字来创建实例,以下就是在Trade类中应用该方法的例子:

  类名: Trade

public double getCommissionPrice()
{
 double commissionPrice = 0.0;

 IPricingPlan plan;
 Class commissionClass;

 try
 {
  if( getCustomer().getPlanId() == 1 )
  {
   commissionClass = Class.forName( "string_interfaces.PricingPlan20" );
  }
  else
  {
   commissionClass = Class.forName( "string_interfaces.PricingPlan1510" );

}

  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类中创建一个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, IllegalAccessExcepti