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

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

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

    隨筆-9  評論-168  文章-266  trackbacks-0

     IoC全名Inversion of Control,如果中文硬要翻譯過來的話,就是「控制反轉(zhuǎn)」。初看IoC,從字面上不容易瞭解其意義,我覺得要瞭解IoC,要先從Dependency Inversion開始瞭解,也就是依賴關(guān)係的反轉(zhuǎn)。

     Dependency Inversion在下面這篇文章中有了清楚的解釋:
    http://www.objectmentor.com/publications/dip.pdf

     簡單的說,在模組設(shè)計(jì)時(shí),高層的抽象模組通常是與業(yè)務(wù)相關(guān)的模組,它應(yīng)該具有重用性,而不依賴於低層的實(shí)作模組,例如如果低層模組原先是軟碟存取模式,而高層模組是個(gè)存檔備份的需求,如果高層模組直接叫用低層模組的函式,則就對其產(chǎn)生了依賴關(guān)係。

    舉個(gè)例子,例如下面這個(gè)程式:

    #include <floppy.h>
    ....
    void save() {
    ....
    saveToFloppy()
    }
    }

     由於save()程式依賴於saveToFloppy(),如果今天要更換低層的存儲模組為Usb碟,則這個(gè)程式?jīng)]有辦法重用,必須加以修改才行,低層模組的更動造成了高層模組也必須跟著更動,這不是一個(gè)好的設(shè)計(jì)方式,我們希望模組都依賴於模組的抽象,這樣才可以重用高層的業(yè)務(wù)設(shè)計(jì)。

     如果以物件導(dǎo)向的方式來設(shè)計(jì),依賴反轉(zhuǎn)(Dependency Inversion)的解釋變?yōu)槌淌讲粦?yīng)依賴實(shí)作,而是依賴於抽象,實(shí)作必須依賴於抽象。我們來看看下面這個(gè)Java程式:

    BusinessObject.java
    public class BusinessObject {
    private FloppyWriter writer = new FloppyWriter();
    ....
    public void save() {
    ...
    writer.saveToFloppy();
    }
    }

     在這個(gè)程式中,BusinessObject的存檔依賴於實(shí)際的FloppyWriter,如果今天我們想要將存檔改為存至Usb碟,我們必須修改或繼承BusinessObject進(jìn)行擴(kuò)展,而無法直接使用BusinessObject。

    如果透過介面的宣告,可以改進(jìn)此一情況,例如:

    public interface IDeviceWriter {
    public void saveToDevice();
    }
    public class BusinessObject {
    private IDeviceWriter writer;
    public void setDeviceWriter(IDeviceWriter writer) {
    this.writer = writer;
    }
    public void save() {
    ....
    writer.saveToDevice();
    }
    }

     這樣一來,BusinessObject就是可重用的,如果今天我有存儲至Floppy或Usb碟的需求,我只要實(shí)作IDeviceWriter即可,而不用修改BusinessObject:

    public class FloppyWriter implement IDeviceWriter {
    public void saveToDevice() {
    ....
    // 實(shí)際儲存至Floppy的程式碼
        }
    }
    public class UsbDiskWriter implement IDeviceWriter {
    public void saveToDevice() {
    ....
    // 實(shí)際儲存至UsbDisk的程式碼
        }
    }

     從這個(gè)角度來看,Dependency Inversion的意思即是程式不依賴於實(shí)作,而是程式與實(shí)作都要依賴於抽象。

     IoC的Control是控制的意思,其實(shí)其背後的意義也是一種依賴關(guān)係的轉(zhuǎn)移,如果A依賴於B,其意義即是B擁有控制權(quán),我們要轉(zhuǎn)移這種關(guān)係,所以依賴關(guān)係的反轉(zhuǎn)即是控制關(guān)係的反轉(zhuǎn),藉由控制關(guān)係的轉(zhuǎn)移,我們可以獲得元件的可重用性,在上面的Java程式中,整個(gè)控制權(quán)從實(shí)際的 FloppyWriter轉(zhuǎn)移至抽象的IDeviceWriter介面上,使得BusinessObject、FloppyWriter、 UsbDiskWriter這幾個(gè)實(shí)現(xiàn)依賴於抽象的IDeviceWriter介面。

     從容器(Container)的角度,程式的業(yè)務(wù)邏輯部份應(yīng)是可以重用的,不應(yīng)受到所使用框架或容器的影響,因?yàn)槲覀兛赡苻D(zhuǎn)移整個(gè)業(yè)務(wù)邏輯至其它的框架或容器,如果業(yè)務(wù)邏輯過於依賴容器,則轉(zhuǎn)移至其它的框架或容器時(shí),就會發(fā)生困難。

     IoC在容器的角度,可以用這麼一句好萊塢名言來代表:"Don't call me, I'll call you." 以程式的術(shù)語來說的話,就是「不要向容器要求您所需要的(物件)資源,容器會自動將這些物件給您!」。IoC要求的是容器不侵入應(yīng)用程式本身,應(yīng)用程式本身提供好介面,容器可以透過這些介面將所需的資源注至程式中,應(yīng)用程式不向容器主動要求資源,故而不會依賴於容器的元件,應(yīng)用程式本身不會意識到正被容器使用,可以隨時(shí)從容器中脫離轉(zhuǎn)移而不用作任何的修改,而這個(gè)特性正是一些業(yè)務(wù)邏輯中間件最需要的。


                                                                 -------------[轉(zhuǎn)http://www.javaworld.com.tw Added by 良葛格, last edited by Forth on Aug 13, 2005  (view change) ]

    posted on 2007-10-30 11:12 紫蝶∏飛揚(yáng)↗ 閱讀(463) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 国产一区二区三区免费看| 久久九九亚洲精品| a级在线免费观看| 亚洲男女一区二区三区| 国产禁女女网站免费看| a级毛片高清免费视频就| 亚洲乱码无限2021芒果| 亚洲色一色噜一噜噜噜| 99久久精品国产免费| 青青青亚洲精品国产| 亚洲人成电影在在线观看网色 | 国产成人高清精品免费软件| 本道天堂成在人线av无码免费| 亚洲狠狠ady亚洲精品大秀| 亚洲国产免费综合| 动漫黄网站免费永久在线观看| 窝窝影视午夜看片免费| 亚洲制服丝袜中文字幕| 中文字幕亚洲一区二区三区| 免费在线观看的网站| 国产精品免费福利久久| 美女被艹免费视频| 亚洲综合色婷婷在线观看| 亚洲AV无码乱码国产麻豆穿越| 永久免费看bbb| 亚洲免费黄色网址| 永久免费AV无码网站国产| 美女扒开屁股让男人桶爽免费| 精品亚洲aⅴ在线观看| 亚洲综合无码精品一区二区三区| 成人午夜性A级毛片免费| 91青青国产在线观看免费 | 欧洲黑大粗无码免费| 中文字幕无码免费久久| 免费人成网站永久| 亚洲女女女同性video| 亚洲一级毛片免费在线观看| 亚洲视频在线免费观看| 国产精品久久久亚洲| 91麻豆精品国产自产在线观看亚洲| 在线A级毛片无码免费真人|