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

大龍的博客

常用鏈接

統計

最新評論

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>
            国产欧美精品| 91久久久亚洲精品| 国产精品一卡二| 欧美日韩在线第一页| 免费h精品视频在线播放| 久久久久久久综合狠狠综合| 午夜精品久久久久| 午夜精品福利一区二区三区av | 伊人狠狠色j香婷婷综合| 国产精品腿扒开做爽爽爽挤奶网站| 欧美日韩综合久久| 国产视频在线观看一区二区| 国语对白精品一区二区| 亚洲国产欧美一区二区三区同亚洲| 欧美一二三视频| 久久久久久精| 欧美激情中文字幕乱码免费| 欧美日韩国产精品自在自线| 国产精品乱人伦中文| 在线观看av不卡| 亚洲性线免费观看视频成熟| 久久av在线| 亚洲国产精品第一区二区| 亚洲一区二区三| 欧美77777| 国产偷国产偷亚洲高清97cao | 久久亚洲高清| 欧美日韩一级片在线观看| 国产日韩在线播放| 亚洲美女淫视频| 久久精品国产99国产精品澳门| 欧美国产第一页| 亚洲一区日韩在线| 蜜臀va亚洲va欧美va天堂| 国产精品久久久久久久午夜 | 国产精品久久久久久久久久尿| 日韩视频在线观看免费| 小嫩嫩精品导航| 欧美激情综合| 亚洲成人在线视频播放| 亚洲一区亚洲| 亚洲人体一区| 免费精品99久久国产综合精品| 国产精品一区毛片| 中文一区字幕| 亚洲精品网址在线观看| 久久免费国产| 国产综合久久| 欧美亚洲综合另类| 在线一区二区三区四区| 欧美激情一区二区三级高清视频| 国产原创一区二区| 欧美一二区视频| 亚洲天堂av电影| 国产精品久久精品日日| 亚洲天堂成人在线观看| 亚洲精品一区二区三区不| 欧美成人伊人久久综合网| 亚洲高清激情| 亚洲福利视频二区| 欧美激情视频一区二区三区在线播放 | 欧美日韩国产123| 日韩一级免费| 在线一区二区视频| 亚洲精选在线观看| 欧美日韩精品在线| 亚洲图中文字幕| 一区二区欧美日韩| 国产精品h在线观看| 亚洲欧美日韩第一区| 一本色道久久综合亚洲精品不| 欧美成人午夜激情| 一区二区三区欧美激情| 一区二区三区免费看| 国产精品免费电影| 久久精品噜噜噜成人av农村| 欧美专区18| 亚洲国产一区二区精品专区| 欧美岛国在线观看| 欧美日韩91| 欧美一区在线看| 久久午夜电影| 一区二区三区**美女毛片 | 国产精品自拍三区| 久久久国产精品亚洲一区 | 欧美搞黄网站| 欧美日韩美女在线观看| 亚洲综合视频1区| 欧美一区二区精品在线| 亚洲国产精品v| 一级成人国产| 激情亚洲网站| 亚洲毛片在线看| 好吊妞这里只有精品| 亚洲欧洲综合另类| 国产欧美日韩亚州综合| 欧美黄在线观看| 国产精品人人做人人爽| 欧美成人精品福利| 国产精品日韩在线一区| 亚洲东热激情| 国产一区二区视频在线观看| 亚洲国产成人tv| 国产欧亚日韩视频| 亚洲精品综合精品自拍| 极品尤物久久久av免费看| 亚洲精品久久久久久一区二区| 国产欧美日韩亚洲精品| 亚洲精品日本| 亚洲国产精品久久久久久女王| 一区二区三区日韩| 亚洲精品男同| 久久这里只有精品视频首页| 午夜日韩视频| 欧美四级在线观看| 亚洲高清不卡在线| 精品二区视频| 亚洲一区二区视频在线| 国内揄拍国内精品久久| 在线亚洲一区二区| 欧美视频三区在线播放| 女女同性精品视频| 国产酒店精品激情| 亚洲伦理在线| 亚洲精品久久久久久一区二区| 欧美一区二区三区在线视频| 亚洲男女自偷自拍| 欧美视频免费在线| 亚洲精品永久免费精品| 中文网丁香综合网| 在线视频亚洲| 欧美日韩亚洲一区三区| 91久久精品美女高潮| 亚洲区欧美区| 欧美高清你懂得| 欧美激情视频一区二区三区在线播放| 国产一区二区三区网站| 久久国产直播| 久久一区亚洲| 亚洲福利视频在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美成年网站| 日韩视频免费| 欧美日韩精品一区二区三区| 亚洲看片一区| 欧美一区成人| 韩日欧美一区二区| 男女视频一区二区| 91久久久久久久久久久久久| 一区二区三区精品视频| 欧美深夜福利| 午夜精品视频在线| 巨胸喷奶水www久久久免费动漫| 在线不卡a资源高清| 美女在线一区二区| 99视频精品免费观看| 久久福利毛片| 亚洲激情视频在线| 欧美日韩精品在线播放| 亚洲一区二区三区四区五区黄| 久久精品国产精品亚洲| 亚洲国产黄色| 欧美亚韩一区| 久久久久国产成人精品亚洲午夜| 亚洲成人在线免费| 久久精品国产亚洲a| 欧美激情亚洲精品| 99视频精品免费观看| 国产精品va| 久久精品国产2020观看福利| 亚洲高清在线播放| 亚洲欧美精品| 亚洲国产日韩一区| 国产精品久久久久久亚洲毛片| 久久国产精品黑丝| 亚洲国产天堂久久综合| 午夜视频久久久| 亚洲欧洲视频在线| 国产欧美精品xxxx另类| 欧美国产一区二区在线观看| 亚洲一区视频在线观看视频| 免费不卡在线视频| 午夜精品久久久久久久蜜桃app| 亚洲大片av| 国产日韩在线一区| 欧美性理论片在线观看片免费| 久久亚洲欧洲| 欧美一区二区日韩| 9l国产精品久久久久麻豆| 麻豆精品91| 国产视频一区免费看| 欧美成人免费在线| 亚洲视频1区2区| 激情综合视频| 国产精品大片| 欧美韩日一区二区三区| 久久九九久久九九| 亚洲欧美日韩国产中文| 亚洲美女中出| 亚洲人精品午夜|