<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    選擇java 進(jìn)入自由開(kāi)放的國(guó)度

    隨筆 - 49, 文章 - 3, 評(píng)論 - 154, 引用 - 1
    數(shù)據(jù)加載中……

    IoC的初步理解

    好久寫(xiě)有關(guān)java技術(shù)的文章了,這幾天在圖書(shū)館看到《Spring in Action》就借過(guò)來(lái)隨手翻翻,覺(jué)得第一章的IoC的概念講的很好,現(xiàn)在整理如下。
    (1)從類的耦合說(shuō)起
    在實(shí)際的系統(tǒng)中,要多個(gè)類共同協(xié)作來(lái)完成某一項(xiàng)任務(wù),一般稱為復(fù)合。在系統(tǒng)的設(shè)計(jì)過(guò)程中,耦合是不可避免的,是必須的,但是它會(huì)帶來(lái)以下問(wèn)題:
    --難以測(cè)試:看下面的兩個(gè)類:
    KnightOfTheRoundTable
    ????????????????? |
    ????????????????? |??new
    ?????????????????V
    ???????? HolyGrailQuest
    在KnightOfTheRoundTable類中使用了HolyGrailQuest類,并且可能使用不同的Quest類。這兩個(gè)類的功能是騎士去執(zhí)行不同的任務(wù),HolyGrail只是代表了一種任務(wù)。這種通過(guò)國(guó)new的方式,使得knight和quest兩個(gè)類緊密的耦合在一起。設(shè)計(jì)完成后做單元測(cè)試,看下面的代碼:
    KnightOfTheRoundTable knight = new KnightOfTheRoundTable("Bedivere");
    HolyGrail grail = knight.embarkOnQuery();
    assertNotNull(grail);
    assertTrue(grail.isHoly());
    在測(cè)試KnightOfTheRoundTable類的時(shí)候,間接的測(cè)試了HolyGrailQuest類,但是對(duì)于HolyGrailQuest類的情況并沒(méi)有很顯式的測(cè)試,所以使用了最后的兩行代碼來(lái)測(cè)試,顯得很笨拙。不知道是否測(cè)試了所有可能的情況。
    --難以維護(hù)
    如果以后修改了代碼,或者增加了/改變了knight的任務(wù),代碼必須改動(dòng),測(cè)試代碼也要改動(dòng),并且改動(dòng)一個(gè)地方,可能會(huì)影響到其他很多地方,為日后的維護(hù)工作帶來(lái)了麻煩
    --緊耦合
    提示:這種模式引起的問(wèn)題,主要是因?yàn)榫o耦合所致,所以要解決這種問(wèn)題的首要方案就是解耦合,但如何來(lái)解耦合呢?請(qǐng)繼續(xù)看:
    (2)解耦合——通過(guò)接口interface來(lái)實(shí)現(xiàn)
    因?yàn)轵T士可能執(zhí)行不同的任務(wù),也有不同種類的騎士,所以我們可以將任務(wù)和騎士抽象為接口,將具體的實(shí)現(xiàn)隱藏在接口之下,這樣就不必在knight類中通過(guò)顯示的 HolyGrailQuest quest = new HolyGrailQuest ()這樣的語(yǔ)句來(lái)創(chuàng)建Quest對(duì)象,而可以通過(guò)接口Quest quest = new HolyGrailQuest()來(lái)實(shí)現(xiàn)。這樣就形成了如下的類圖:

    這樣,雖然使用了接口,使得層次分明,通過(guò)接口Quest來(lái)實(shí)現(xiàn)探險(xiǎn),但是還是只能從事一種探險(xiǎn)任務(wù),而如何才能讓騎士從事任何一種任務(wù)呢?請(qǐng)繼續(xù)看!
    (3)給予與獲得
    騎士執(zhí)行探險(xiǎn)任務(wù)有兩種方式:
    第一、讓騎士主動(dòng)獲得探險(xiǎn)任務(wù),前面的實(shí)現(xiàn)方式屬于這類,通過(guò)new來(lái)實(shí)現(xiàn);
    第二,讓騎士被動(dòng)的獲得任務(wù),即給予騎士某項(xiàng)探險(xiǎn)任務(wù),這樣就解決了上面的問(wèn)題(讓騎士可以從事任何一種任務(wù),只要給他們分配即可)。
    實(shí)際實(shí)現(xiàn)的方式很簡(jiǎn)單,看如下代碼:
    public void setQuest(Quest quest){
    ?? this.quest = quest;
    }
    簡(jiǎn)單的代碼實(shí)現(xiàn)了方式的改變,這樣給KnightOfTheRoundTable類傳入任何的Quest任務(wù),都可以接受了。
    到這里可以很明顯的看出來(lái),我們將以前的new方式,翻轉(zhuǎn)過(guò)來(lái),即不是讓主動(dòng)獲得依賴類,而是被動(dòng)的獲得依賴類,這就是IoC的核心,實(shí)際Fowler說(shuō)得依賴注入也很貼切,即向類中“注入”它依賴的其他類。

    好了,到這里,應(yīng)該知道了IoC的基本概念了吧,也知道了IoC的基本功能了吧。
    要想更深入的了解,請(qǐng)關(guān)注我的文章。

    posted on 2006-09-30 10:37 soochow_hhb 以java論成敗 以架構(gòu)論英雄 閱讀(2577) 評(píng)論(3)  編輯  收藏 所屬分類: Struts

    評(píng)論

    # re: IoC的初步理解  回復(fù)  更多評(píng)論   

    垃圾。說(shuō)的不清不楚。
    舉的例子給差啊。
    我讀起來(lái)。還以為是中世紀(jì)的騎士。還以為是寫(xiě)文藝復(fù)興運(yùn)動(dòng)。
    2006-10-01 22:30 | 路是爬出來(lái)的

    # re: IoC的初步理解  回復(fù)  更多評(píng)論   

    樓上的太偏激啦
    2006-10-09 02:45 | ddd

    # re: IoC的初步理解  回復(fù)  更多評(píng)論   

    理解力士替代原則,就明白IOC了
    2007-02-10 17:13 | 。。。
    主站蜘蛛池模板: 亚洲人成网77777色在线播放| 亚洲国产综合91精品麻豆| 国产日韩精品无码区免费专区国产| 不卡精品国产_亚洲人成在线| 青青草无码免费一二三区| 久久亚洲最大成人网4438| 免费人妻av无码专区| 久久aⅴ免费观看| 亚洲成AV人片高潮喷水| 亚洲日韩精品一区二区三区| 成年私人影院免费视频网站| 国产福利在线观看永久免费| 亚洲国产成人九九综合| 国产亚洲精品不卡在线| **aaaaa毛片免费同男同女| 中文字幕无码播放免费| 国产精品亚洲综合网站| 亚洲午夜精品久久久久久人妖| 久久WWW免费人成人片| 免费无码黄网站在线看| 亚洲欧洲日韩不卡| 国产精品免费视频播放器| 99视频在线免费| 一级毛片正片免费视频手机看| 亚洲成a人在线看天堂无码| 最近中文字幕大全免费视频| 一区二区三区精品高清视频免费在线播放 | 黄页网站在线免费观看| 久久国产亚洲精品无码| 久久久久亚洲AV无码专区桃色| 无人在线观看免费高清视频| 手机看片国产免费永久| 亚洲五月六月丁香激情| 亚洲一区无码精品色| 在线a毛片免费视频观看| 久久国产色AV免费观看| 成年女人A毛片免费视频| 小说区亚洲自拍另类| 亚洲精品无码专区在线| 亚洲一区二区三区在线网站| 亚洲综合无码一区二区|