国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

動態(tài)擴展Java應用

2019-11-17 05:59:34
字體:
來源:轉載
供稿:網(wǎng)友

 

  摘要:你想寫出無需改變源代碼就可以進行擴展的程序嗎?這篇文章介紹了如何使用interface和動態(tài)class載入來創(chuàng)建高擴展性的系統(tǒng)。從中你也可以學習到如何令其他的編程者和用戶不需你的源代碼,就可以對程序進行擴展。首先我們看一個沒有使用interface和動態(tài)載入的簡單例子,然后再講述一個動態(tài)載入類的例子,這些類是由一個文件或者數(shù)據(jù)庫的表格中讀取的。

  你曾經(jīng)開發(fā)過一個要經(jīng)常添加新功能的應用嗎?在下面的例子中,市場部將會為每個顧客提供各種各樣的價格處理。你的程序需要處理這些新的需求,你也必須讓用戶可以定制你的軟件而無需改變源代碼。

  你可以做到避免修改現(xiàn)有的代碼并且測試加入的新功能嗎?你可以做到無需重新編譯全部的東西來加入新的類嗎?答案是可以的,你可能已經(jīng)猜到了,就是使用interface和動態(tài)類載入。

  要說明一下的是,為了說明方便,這里介紹的類和體系都是經(jīng)過簡化的。

  什么是interface(接口)?

  interface只是描述一個對象是如何被調用的。當你定義了一個接口,你就定義了其它的對象如何使用它。

  對于大部分使用java的人來說,你們可能已經(jīng)知道接口是什么東西。但對于那些仍然不清楚的人,我將介紹一些基本的知識,然后創(chuàng)建一些復雜的例子。假如你已經(jīng)很清楚接口的知識,你可以直接跳到“使用字符串來指定類名字”的部分。

  接口的威力

  以下的例子說明了接口的威力。假定你的客戶是搞經(jīng)紀的,他們想讓你建立一個交易的系統(tǒng)。他們的交易是各種各樣的:包括有股票、債券和日用品等等。不同客戶的交易數(shù)量也是不一樣的,該數(shù)量由客戶稱為PRicing plans的東東來定義。

  你首先考慮類的設計。主要的類和它們的屬性由客戶來定義,可以是:

  Customer(顧客):Name(名字),Address(地址),Phone(電話)和PricingPlan

  Trade(交易):TradeType(股票、債券或者日用品),ItemTraded(股票的記號)、NumberOfItemsTraded, ItemPrice, CommissionAmount

  PricingPlan:通過一個過程的調用來計算該交易的CommissionAmount

不使用interface的編碼

  開始編碼時你可以不使用接口,然后再由該代碼增強其功能。現(xiàn)在,該客戶有兩個標價計劃定義如下:

  計劃1:對于常規(guī)的顧客,$20/交易

  計劃2:一個月中的前10個交易,$15/交易,以后的 $10/交易

  Trade對象使用一個PricingPlan對象來計算要收顧客多少傭金。你為每個標價計劃都創(chuàng)建了一個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

  使用接口的話,將會令上面的例子變得更加簡單。你可以創(chuàng)建PricingPlan的接口,然后定義實現(xiàn)該接口的PricngPlan類:

  接口名:ipricingPlan

public interface IPricingPlan {
 public double calculateCommission( Trade trade );
}

  由于你定義的是一個接口,所以你無需為calculateCommission()定義一個方法體。真正的PricingPlan類將會實現(xiàn)該部分的代碼。接著你就要修改PricingPlan類,第一步是聲明它將會實現(xiàn)你剛剛定義的接口。你只要在PricingPlan類的定義中加入以下代碼就可以:

public class PricingPlan20 extends Object implements IPricingPlan {

  在Java中,當你聲明將實現(xiàn)一個接口的時候,你必須實現(xiàn)該接口中的全部方法(除非你要創(chuàng)建一個抽象類,這里不討論)。因此所有實現(xiàn)IPricingPlan的類都必須定義一個calculateCommission()的方法。該方法的所有標記必須和接口定義的完全一樣,所以它必須接受一個Trade對象,由于我們的兩個PricingPlan類中都已經(jīng)定義了calculateCommission()方法,因為我們沒有必要作進一步的修改。假如你要創(chuàng)建新的PricingPlan類,你就必須實現(xiàn)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接口。你實際創(chuàng)建的對象根據(jù)客戶的標價計劃而定。由于兩個PricingPlan類都實現(xiàn)了IPricingPlan接口,所以你可以將兩個新的實例賦給同一個變量。Java實際上并不關心實現(xiàn)該接口的實際對象,它只是關心接口。

  使用字符串來指定類名

  假定老板告訴你該公司又有兩個新的價格計劃,接著還有更多。這些價格計劃是每交易$8或者$10。你決定要創(chuàng)建兩個新的PricingPlan類: PricingPlan8 和 PricingPlan10。

  在這種情況下,你必須修改Trade類來包含這些新的價格計劃。你可以加入更多的if/then/else句子,但這不是一個好方法,假如價格計劃變得越來越多時,代碼將會顯得十分粗笨。另一個選擇是通過Class.forName() 方法來創(chuàng)建PricingPlan實例,而不是通過new。Class.forName()方法可讓你通過一個字符串名字來創(chuàng)建實例,以下就是在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" );



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 堆龙德庆县| 辉县市| 双辽市| 墨竹工卡县| 竹溪县| 香河县| 丹巴县| 柘荣县| 南漳县| 许昌县| 会东县| 宁蒗| 磐安县| 巴楚县| 高邮市| 开鲁县| 蒙城县| 大余县| 加查县| 邓州市| 织金县| 利津县| 同德县| 姜堰市| 招远市| 阆中市| 沽源县| 安徽省| 固镇县| 专栏| 银川市| 团风县| 武汉市| 汶上县| 汪清县| 梁平县| 丰原市| 车致| 蒙城县| 江山市| 大厂|