青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

JAVA中多接口應用技巧

JAVA在設計接口和類的規則時,有一個明確的規定。JAVA不支持類(實現)的多重繼承,但支持接口(定義)的多重繼承。

我已經無從了解這個設計的初衷,但這樣的規定隱含了以下的意義。

接口是設計的產物,即在需求設計時定義的對軟件功能的定義。而類是實現的產物,它是在實現過程中根據實現的具體情況而完成的。如果用代碼來說明就是:

在設計時我需要我設計的“模塊”提供兩個功能:

1.提供兩個整數相加的功能。

2.提供兩個字符串連接的功能。

 

我是一個偉大的設計師,為了不影響我的整體思路,我不會在這時停下來去實現它,所以我需要一個類似偽代碼的東西來記錄我的實現思路。java說,好,我們為你提供一個叫接口的東西,你只寫下你要實現的東西不用提供具體實現方法。

 

 

[java:nogutter] view plaincopy
  1. interface IMyFunc {  
  2.   
  3.     public int add(int a, int b);  
  4.   
  5.     public String concat(String str1, String str1);  
  6. }  
  

。。。。。。。其它設計。

好了,哪個小匪來領實現這個任務?

小匪甲領取了這個編碼任務。分析大當家的設計思想,啊這個好辦。

 

[java:nogutter] view plaincopy
  1. class MyMathImp implements  IMyFunc{  
  2.   
  3.     public int add(int n1,int n2) {  
  4.   
  5.         //因為傳進來的都是整數,如果不是整數在編譯時就出錯了,  
  6.         //所以我不用檢查,直接的相加,哈哈,今天工資混到手了。  
  7.   
  8.         return n1 + n2;   
  9.       
  10.     }  
  11.   
  12.    
  13.   
  14.     public String concat(String s1,Strings2) {  
  15.   
  16.         //哎,這個,這個好象要檢查一下吧,如果有一個字符串是null,  
  17.         //我是顯示"字符串null"還是顯示"字符串"呢?如果兩個都為null,  
  18.         //我是顯示一個"null"還是顯示"nullnull"呢?  
  19.         //真復雜,嚴密性比具體實現還復雜,我干脆把它放到另一個方法中吧。  
  20.   
  21.         return checkedConcat(s1,s2);  
  22.     }   
  23.   
  24.     String checkedConcat (String s1,String s2){  
  25.         if(s1 == null && s2 == null) return "null";  
  26.         if(s1 == null) s1 = "null";  
  27.         if(s2 == null) s2 = "null";  
  28.         return  s1 + s2;  
  29.     }  
  30.   
  31. }  
 

 

checkedConcat我還想被別的地方調用,所以我不想設計成ptivate的。所以我設計的MyModuleImp從外面可以看到三個方法。

 

大當家的叫我提供兩個方法,而我的實現有三個方法,幸虧有接口啊,我發布這個模塊時只提供接口的文檔。這樣你在智能感應的IDE中一打開這個接口看到的只是大當家定義的兩個方法。

 

所以:接口可以只將設計意圖的方法暴露給調用者。

 

那么,當我一個類提供了不同功能的方法時,我想在不同時候只顯示某類功能的方法,怎么辦?

其實這個問題Sun的代碼中都沒有很好地處理。比如我的一個類提供了對象的初始化方法和對象釋放的方法,整數運算的方法和字符串運算方法以及圖形運算方法。當然這只是舉例。

有人說這個類設計不合理,這么多不同類型的功能應該在不同類中實現。

說得對!但是..........

如果我們的對象是本地生成的,多次new多個對象成本不是太高,如果我們的對象是從遠程調用的,那么多個對象的生成成本就很高了。

另外任何對象自身管理的方法和業務方法不能分到兩個類中實現吧?一個只有自身管理的方法的類除了自戀還有什么用?而有些必須要被始化和釋放等管理的 對象只有業務方法它也工作不起來,所以至少有兩類功能要在同一類中完成。假如它們的重載方法足夠多時,你會看到它們是很多功能的方法按字母排序混合在一 起。

典型的就是URLConnection類,你打開它時,設置請求參數的方法,獲取響應頭域的方法,獲取輸入輸出的方法一大堆。不過還好是它們的命名方式使很多功能相同的方法能排在一起。

如何有效的組織一個實現的不同功能的方法的分類?我們可以通過多接口來完成。

 

這個思想早在COM時代就已經采用了,無論你獲取的是IUnKnown接口還是IDispatch接口還是業務接口,其實反回的都是同一個 CoClass對象,但你獲取不同接口看到的是不同功能的函數。同時你只要實例化一次,獲取到任何接口就可以從這一接口生成其它接口,這對于調用者是非常 有意義的,我不僅能得到不同功能的函數分類,而且不需要多次實例化多個對象。

 

[java:nogutter] view plaincopy
  1. interface IMath {  
  2.   
  3.     public int add(int a, int b);  
  4.   
  5.     public int mul(int a, int b);  
  6. }  
  7.   
  8. interface IStrUtil {  
  9.   
  10.     public String concat(String s1, String s2);  
  11.   
  12.     public String Upper(String s1);  
  13.   
  14. }  
  15.   
  16. interface IObjManager {  
  17.   
  18.     void init();  
  19.   
  20.     void destory();  
  21.   
  22. }  
  23.   
  24. class MyModuleImp implements IMath, IStrUtil, IObjManager {  
  25.   
  26.     public int add(int a, int b) {  
  27.        return a + b;  
  28.     }  
  29.   
  30.     public int mul(int a, int b) {  
  31.        return a * b;  
  32.     }  
  33.   
  34.     public String concat(String s1, String s2) {  
  35.        return checkedConcat(s1, s2);  
  36.     }  
  37.   
  38.     public String Upper(String s1) {  
  39.        return checkedUpper(s1);  
  40.     }  
  41.   
  42.     public void init() {  
  43.        System.out.println("init.........");  
  44.     }  
  45.   
  46.     public void destory() {  
  47.        System.out.println("destory.........");  
  48.     }  
  49.   
  50.     String checkedConcat(String s1, String s2) {  
  51.   
  52.        if (s1 == null && s2 == null)  
  53.            return "null";  
  54.        if (s1 == null) s1 = "null";  
  55.        if (s2 == null) s2 = "null";  
  56.        return s1 + s2;  
  57.     }  
  58.   
  59.     String checkedUpper(String s1) {  
  60.   
  61.        if (s1 == null) return null;  
  62.        return s1.toUpperCase();  
  63.     }  
  64. }  

 

OK!

IObjManager om = new MyModuleImp(); //或getObjFromNet如果我們把生成實例的方法統一封裝起來,以及對象的生命周期管理都規定在一個類似IUnknown的接口中,我們就可以 把多功能的不同類有一個統一的管理行為,就象遠程EJB對象的實例化。

 

om. 這時我們看到的只是IObjManager接口的方法,我們可以init.destory.

當我們需要它的業務方法時:

 

IMath m = (IMath)om; //相當于QueryInterface

m. 這時我們看到的只是math相關的功能方法。

 

另外當我們想增加一個方法并保留原有方法時只需在新的接口中聲明,并讓實現類繼承自這個接口(其實就是在implements關鍵字后面加上接口名稱)。這樣新舊接口可以并存使用,既不影響以前的代碼,也不影響后來的人使用新接口:

 

[java:nogutter] view plaincopy
  1. interface IMathEx{  
  2.   
  3.     public int add(int a, int b);  
  4.   
  5.     public int mul(int a, int b);  
  6.   
  7.     public double sqrt(double a);  
  8.   
  9. }  
  10.   
  11.    
  12.   
  13. class MyModuleImp implements IMath,IMathEx, IStrUtil, IObjManager{  
  14.   
  15.        //增加public double sqrt(double a)的實現  
  16.   
  17. }  

 

 

這樣原來使用IMath來計算“加和乘“的代碼根本不受影響,而新的程序可以使用IMathEx來計算“加,乘和開方”運算。

所以多接口不僅使我們能夠有效的組織不同功能的代碼,而且可以使對象具有統一的管理方法,同時避免多次生成對象帶來的開銷。

posted on 2012-06-12 02:15 大龍 閱讀(222) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国一区二区在线观看| 久久精品女人天堂| 久久精品久久99精品久久| 亚洲欧美一区二区原创| 亚洲淫片在线视频| 久久不射2019中文字幕| 久久综合五月天婷婷伊人| 噜噜爱69成人精品| 最新高清无码专区| 亚洲精品综合| 亚洲视频1区2区| 久久久久久夜| 欧美日韩日本国产亚洲在线| 国产精品国产三级国产普通话三级 | 久久久久久久高潮| 欧美成年人视频网站| 亚洲美女免费精品视频在线观看| 亚洲视频一二| 免费在线亚洲欧美| 国产欧美日韩在线播放| 亚洲欧洲一区| 久久九九精品| 99国产精品99久久久久久粉嫩 | 欧美成人一区二区三区片免费| 欧美日韩在线播| 一区福利视频| 亚洲视频国产视频| 噜噜噜91成人网| 亚洲最新视频在线| 免费国产自线拍一欧美视频| 国产精品毛片| 亚洲日本一区二区三区| 久久国产精品黑丝| 一区二区精品在线| 欧美成人免费一级人片100| 国产日韩欧美在线| 亚洲天堂男人| 亚洲日本中文字幕| 久久久水蜜桃av免费网站| 国产精品一区二区三区久久| 99国内精品| 亚洲国产精品999| 久久av一区二区三区亚洲| 国产精品五区| 亚洲欧美伊人| 在线综合亚洲欧美在线视频| 欧美电影专区| 亚洲精品裸体| 亚洲国产精品www| 欧美不卡视频| 亚洲精品裸体| 91久久精品国产91性色| 欧美成人tv| 亚洲精品日韩久久| 亚洲国产成人av| 欧美大片一区二区| 亚洲精品影视在线观看| 亚洲高清一区二| 欧美黄色网络| 中国女人久久久| 亚洲精品三级| 欧美性大战久久久久久久| 一本色道久久综合亚洲精品婷婷| 亚洲高清精品中出| 欧美极品在线观看| 亚洲视频www| 亚洲一区日韩| 国产亚洲精品aa| 美女91精品| 欧美激情视频一区二区三区免费| 亚洲美女免费精品视频在线观看| 亚洲国产成人久久综合| 欧美日韩国产麻豆| 午夜精品久久久久久久久久久久| 亚洲影院免费观看| 伊人成人在线| 亚洲精品视频免费| 国产精品视频自拍| 女生裸体视频一区二区三区| 噜噜噜91成人网| 亚洲香蕉成视频在线观看 | 美女网站在线免费欧美精品| 亚洲电影免费观看高清| 亚洲经典三级| 国产精品丝袜91| 亚洲一区在线免费观看| 农夫在线精品视频免费观看| 亚洲日产国产精品| 亚洲先锋成人| 一区二区三区在线免费观看| 亚洲缚视频在线观看| 国产精品久久久久影院亚瑟| 久久久久久69| 欧美精品一区在线播放| 欧美一区午夜精品| 欧美激情第3页| 久久久免费精品视频| 欧美另类99xxxxx| 狂野欧美一区| 国产精品免费aⅴ片在线观看| 另类春色校园亚洲| 国产精品稀缺呦系列在线| 欧美成人四级电影| 国产日韩欧美在线观看| 日韩一级免费| 亚洲日本中文字幕| 久久精品卡一| 欧美在线高清视频| 欧美手机在线视频| 亚洲国产乱码最新视频| 黑人巨大精品欧美黑白配亚洲| 亚洲精品一区二区三区在线观看| 尤物在线精品| 久久久久一区二区三区| 性欧美暴力猛交另类hd| 欧美日韩一区二区三区在线 | 国产精品中文字幕在线观看| 亚洲电影在线免费观看| 国产亚洲欧美日韩精品| 在线视频一区观看| aⅴ色国产欧美| 麻豆精品视频在线| 美女精品自拍一二三四| 国产一区二区0| 亚洲欧美日韩网| 午夜精品久久久久| 国产精品久久久久9999| 99国产精品久久久久久久| 日韩系列欧美系列| 欧美极品欧美精品欧美视频| 亚洲福利专区| 日韩午夜在线视频| 欧美黑人多人双交| 亚洲精品少妇30p| av不卡免费看| 欧美日韩在线一区二区三区| 亚洲美女啪啪| 午夜激情久久久| 国产农村妇女精品| 欧美亚洲综合在线| 久久久久9999亚洲精品| 狠狠色狠狠色综合日日91app| 久久国产一区二区三区| 牛夜精品久久久久久久99黑人| 亚洲国产mv| 欧美日韩一区二区三区在线观看免| 亚洲另类春色国产| 亚洲欧美在线另类| 亚洲一级二级在线| 91久久国产综合久久蜜月精品 | 欧美黄色成人网| 亚洲精品小视频| 欧美另类极品videosbest最新版本| 亚洲精品乱码久久久久久黑人| 一区二区精品国产| 国产精品久久久久久亚洲调教| 亚洲女人天堂av| 另类亚洲自拍| 一区二区三区欧美在线观看| 国产精品久久一区主播| 久久精品动漫| 亚洲人成亚洲人成在线观看图片| 亚洲视频一二区| 国产亚洲精品久| 免费成人激情视频| 在线午夜精品| 欧美成人精品福利| 亚洲一区国产| 在线免费观看日韩欧美| 欧美日韩亚洲91| 久久激情视频| av成人黄色| 欧美+日本+国产+在线a∨观看| 一区二区三区日韩欧美精品| 狠狠久久婷婷| 国产精品美女午夜av| 免费欧美日韩| 欧美一区二区三区视频在线观看 | 亚洲精品久久久久| 国产伦精品一区二区三区免费迷 | 亚久久调教视频| 亚洲欧洲精品成人久久奇米网| 午夜精品在线看| 亚洲免费观看在线观看| 国产在线拍偷自揄拍精品| 欧美日韩国产综合视频在线观看| 欧美怡红院视频| 在线视频你懂得一区| 亚洲电影第1页| 久久亚洲私人国产精品va| 亚洲曰本av电影| 亚洲美女中文字幕| 在线观看三级视频欧美| 国产日韩精品视频一区| 国产精品草草| 欧美日韩国内| 欧美精品尤物在线| 欧美国产日韩一区二区三区| 久久精品视频一| 久久国产主播精品|