动态扩展Java应用

2016-02-19 18:57 5 1 收藏

下面是个动态扩展Java应用教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  摘要:你想写出无需改变源代码就可以进行扩展的程序吗?这篇文章介绍了如何使用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" );

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1619643.html

延伸阅读
前言 Java语言所具有的面向对象特性,使许多复杂的问题可以分解成相对独立的对象来处理。本文用面向对象的方法,将一个图表组件从分解到如何组合,以及如何进行扩展作了具体的讲解。从简单的折线图到稍复杂的多种外形组合的图表,读者可以学到构建一个可扩展的图表组件是多么的轻易。 常见的图表类型 图表...
在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来。 本质上,浏览器向服务器请求静态图片如jpeg时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中...
1、创建高级对象 使用构造函数来创建对象 构造函数是一个函数,调用它来例示并初始化特殊类型的对象。可以使用 new 关键字来调用一个构造函数。下面给出了使用构造函数的新示例。 var myObject = new Object(); // 创建没有属性的通用对象。 var myBirthday = new Date(1961, 5, 10); // 创建一个 Date 对象。 var myCar = new Car(); //...
Ajax(即异步 JavaScript 和 XML)是一种 Web 应用程序开发的手段,它采用客户端脚本与 Web 服务器交换数据。所以,不必采用会中断交互的完整页面刷新,就可以动态地更新 Web 页面。使用 Ajax,可以创建更加丰富、更加动态的 Web 应用程序用户界面,其即时性与可用性甚至能够接近本机桌面应用程序。 Ajax 不是一项技术,而更像是一个 模式 —...
  摘要:随着嵌入式技术的快速发展和嵌入式设备的普及,嵌入式应用发展的一个关键趋势是从静态的、固定的系统功能到动态的、可扩展的系统功能。本文主要进行嵌入式Linux系统内核动态扩展技术的讨论。首先,介绍嵌入式Linux系统的发展状况和研究嵌入式Linux动态扩展性的意义。然后,讨论目前几种主要的核心动态扩展技术,以及各种技术...

经验教程

651

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部