分享
 
 
 

动态扩展Java应用

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要:你想写出无需改变源代码就可以进行扩展的程序吗?这篇文章介绍了如何使用interface和动态class载入来创建高扩展性的系统。从中你也可以学习到如何令其他的编程者和用户不需你的源代码,就可以对程序进行扩展。首先我们看一个没有使用interface和动态载入的简单例子,然后再讲述一个动态载入类的例子,这些类是由一个文件或者数据库的表格中读取的。

你曾经开发过一个要经常添加新功能的应用吗?在下面的例子中,市场部将会为每个顾客提供各种各样的价格处理。你的程序需要处理这些新的需求,你也必须让用户可以定制你的软件而无需改变源代码。

你可以做到避免修改现有的代码并且测试加入的新功能吗?你可以做到无需重新编译全部的东西来加入新的类吗?答案是可以的,你可能已经猜到了,就是使用interface和动态类载入。

要说明一下的是,为了说明方便,这里介绍的类和体系都是经过简化的。

什么是interface(接口)?

interface只是描述一个对象是如何被调用的。当你定义了一个接口,你就定义了其它的对象如何使用它。

对于大部分使用Java的人来说,你们可能已经知道接口是什么东西。但对于那些仍然不清楚的人,我将介绍一些基本的知识,然后创建一些复杂的例子。假如你已经很清楚接口的知识,你可以直接跳到“使用字符串来指定类名字”的部分。

接口的威力

以下的例子说明了接口的威力。假定你的客户是搞经纪的,他们想让你建立一个交易的系统。他们的交易是各种各样的:包括有股票、债券和日用品等等。不同客户的交易数量也是不一样的,该数量由客户称为pricing plans的东东来定义。

你首先考虑类的设计。主要的类和它们的属性由客户来定义,可以是:

Customer(顾客):Name(名字),Address(地址),Phone(电话)和PricingPlan

Trade(交易):TradeType(股票、债券或者日用品),ItemTraded(股票的记号)、NumberOfItemsTraded, ItemPrice, CommissionAmount

PricingPlan:通过一个过程的调用来计算该交易的CommissionAmount

不使用interface的编码

开始编码时你可以不使用接口,然后再由该代码增强其功能。现在,该客户有两个标价计划定义如下:

计划1:对于常规的顾客,$20/交易

计划2:一个月中的前10个交易,$15/交易,以后的 $10/交易

Trade对象使用一个PricingPlan对象来计算要收顾客多少佣金。你为每个标价计划都创建了一个PricingPlan类。对于计划1,该类称为PricingPlan20,而计划2的类则称为PricingPlan1510。两个类都通过一个称为CalcCommission()的过程来计算佣金。代码如下所示:

类名: PricingPlan20

public double calculateCommission( Trade trade )

{

return 20.0;

}

类名: PricingPlan1510

public double calculateCommission( Trade trade )

{

double commission = 0.0;

if( trade.getCustomer().getNumberOfTradesThisMonth() <= 10 )

commission = 15.0;

else

commission = 10.0;

return commission;

}

以下是在交易中得到佣金的代码:

public double getCommissionPrice()

{

double commissionPrice = 0.0;

if( getCustomer().getPlanId() == 1 )

{

PricingPlan20 plan1 = new PricingPlan20();

commissionPrice = plan1.calculateCommission( this.getCustomer() );

plan1 = null;

}

else

{

PricingPlan1510 plan2 = new PricingPlan1510();

commissionPrice = plan2.calculateCommission( this.getCustomer() );

plan2 = null;

}

return commissionPrice;

}

使用interface

使用接口的话,将会令上面的例子变得更加简单。你可以创建PricingPlan的接口,然后定义实现该接口的PricngPlan类:

接口名:IPricingPlan

public interface IPricingPlan {

public double calculateCommission( Trade trade );

}

由于你定义的是一个接口,所以你无需为calculateCommission()定义一个方法体。真正的PricingPlan类将会实现该部分的代码。接着你就要修改PricingPlan类,第一步是声明它将会实现你刚刚定义的接口。你只要在PricingPlan类的定义中加入以下代码就可以:

public class PricingPlan20 extends Object implements IPricingPlan {

在Java中,当你声明将实现一个接口的时候,你必须实现该接口中的全部方法(除非你要创建一个抽象类,这里不讨论)。因此所有实现IPricingPlan的类都必须定义一个calculateCommission()的方法。该方法的所有标记必须和接口定义的完全一样,所以它必须接受一个Trade对象,由于我们的两个PricingPlan类中都已经定义了calculateCommission()方法,因为我们没有必要作进一步的修改。假如你要创建新的PricingPlan类,你就必须实现IPricingPlan和相应的calculateCommission()方法。

接着你可以修改Trade类的getCommissionPrice()方法来使用该接口:

类名: Trade

public double getCommissionPrice()

{

double commissionPrice = 0.0;

IPricingPlan plan;

if( getCustomer().getPlanId() == 1 )

{

plan = new PricingPlan20();

}

else

{

plan = new PricingPlan1510();

}

commissionPrice = plan.calculateCommission( this );

return commissionPrice;

}

要注重的是,你将PricingPlan变量定义为IPricingPlan接口。你实际创建的对象根据客户的标价计划而定。由于两个PricingPlan类都实现了IPricingPlan接口,所以你可以将两个新的实例赋给同一个变量。Java实际上并不关心实现该接口的实际对象,它只是关心接口。

使用字符串来指定类名

假定老板告诉你该公司又有两个新的价格计划,接着还有更多。这些价格计划是每交易$8或者$10。你决定要创建两个新的PricingPlan类: PricingPlan8 和 PricingPlan10。

在这种情况下,你必须修改Trade类来包含这些新的价格计划。你可以加入更多的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" );

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有