|
網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機整體,實現(xiàn)資源的全面共享和有機協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數(shù)據(jù)資源、信息資源、知識資源、專家資源、大型數(shù)據(jù)庫、網(wǎng)絡(luò)、傳感器等。 當前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認為是互聯(lián)網(wǎng)發(fā)展的第三階段。 三、COM中的幾個重要概念 1、組件: 其實只要你仔細閱讀了前面的部分,組件的概念應該已經(jīng)很清楚了。這里所說的組件,就是前面反復在討論的所謂“模塊”,F(xiàn)在我只想強調(diào)一下組件需要滿足的一些條件。首先是封裝性,組件必須向外部隱藏其內(nèi)部的實現(xiàn)細節(jié),使從外部所能看到的只是接口。然后是組件必須能動態(tài)鏈接到一起,而不必像面向?qū)ο笾械腸lass一樣必須重新編譯。 2、接口: 由于組件向外部隱藏了其內(nèi)部的細節(jié),因此客戶要使用組件時就必須通過一定的機制,也就是說要通過一定的方法來實現(xiàn)客戶與組件之間的通信,這就需要接口。所謂接口就是組件對外暴露的、向外部客戶提供服務(wù)的“連接點”。外部的客戶見不到組件內(nèi)部的細節(jié),它所能看到的只是接口,客戶也是通過接口來獲取組件提供的服務(wù)。這有點像OSI網(wǎng)絡(luò)協(xié)議分層模型,每一層就像一個組件,它內(nèi)部的實現(xiàn)細節(jié)對于其他層是不可見的;而每一層通過“服務(wù)接入點”向其上層提供服務(wù),這就像這里所說的接口。一般來說,接口總是固定的,也是公開的。組件的開發(fā)人員要實現(xiàn)這些接口,而客戶則通過接口獲得服務(wù)。正是接口的這種固定和公開,才使得組件和客戶能夠在不了解對方的情況下達成一致。 3、客戶: 這里所說的客戶不是指使用軟件的用戶,而是指要使用某一個組件的程序或模塊。也就是說,這里的客戶是相對組件來說的。 四、COM的實現(xiàn)原理與雛形模擬 COM編程的一個重要特點就是要模塊化,說得具體一些,就是要將客戶和組件分隔開來,而客戶和組件之間又是通過接口來通信的。下面,我就介紹一下COM是怎樣將客戶與組件分隔開來,又是怎樣利用接口來實現(xiàn)客戶與組件間的通信的。 首先我要講講接口。COM中的接口實際上是一個函數(shù)地址表,當組件實現(xiàn)了這個接口后,這個函數(shù)地址表中就填滿了組件所實現(xiàn)的那些接口函數(shù)的地址。而客戶也就是通過這個函數(shù)地址表獲得組件中那些接口函數(shù)的指針,從而獲得組件所提供的服務(wù)的。從某種意義上說,我們可以把接口理解為c++中的虛擬基類;或者說,在c++中可以用虛擬基類來實現(xiàn)接口!這是因為COM中規(guī)定的接口的存儲結(jié)構(gòu),和c++中的虛擬基類在內(nèi)存中的結(jié)構(gòu)是一致的。其存儲結(jié)構(gòu)如下圖: 接口有了,那么組件又是怎樣實現(xiàn)接口的呢?實際上,如果用虛擬基類來實現(xiàn)接口,那么組件就是對這個虛擬基類的繼承。大家知道,當某個類繼承于一個虛擬基類的時候,它就要實現(xiàn)這個虛擬基類里聲明的虛函數(shù),這就正好與組件實現(xiàn)接口這一點相吻合。舉一個例子來說明,有一個接口InterfaceA,組件ComponentB要實現(xiàn)這個接口,那么就可以這樣用c++語言來描述: //接口: 而客戶只需要得到一個指向ComponentB實體的InterfaceA指針就可以獲得ComponentB組件的服務(wù)了: //使用了組件ComponentB的客戶: 但是我們注意到,這樣做組件ComponentB和客戶還是沒有被完全分隔開。因為在客戶代碼里需要創(chuàng)建ComponentB實體,這對于只能看到接口而對組件一無所知的客戶來說,是不可以接受的(比如客戶不會知道組件的類名叫ComponentB)。解決這個問題的方法是在實現(xiàn)組件的動態(tài)鏈接文件(比如dll文件)里創(chuàng)建組件的實體,而不是在客戶代碼里創(chuàng)建組件實體。通常組件都是以dll的形式出現(xiàn)的,而在實現(xiàn)組件的dll里都會實現(xiàn)一個叫CreateInstance的函數(shù),這個函數(shù)可以被外部的客戶調(diào)用。它返回一個接口的指針,當客戶調(diào)用這個函數(shù)后就能夠獲得指向組件實體的接口指針了。它的實現(xiàn)也很簡單: //在實現(xiàn)組件ComponentB的dll里: 當然,真正的CreateInstance函數(shù)沒有這么簡單,我上面的代碼只是一個簡單的模擬。有個CreateInstance函數(shù)之后,客戶代碼就變成了: //使用了組件ComponentB的客戶: 網(wǎng)絡(luò)的神奇作用吸引著越來越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術(shù)都需要適時應勢,對應發(fā)展,這正是網(wǎng)絡(luò)迅速走向進步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!